2012-01-03 29 views
30

Dưới đây là mã của tôiBus lỗi: 10 lỗi

#import <stdio.h> 
#import <string.h> 

int main(int argc, const char *argv[]) 
{ 
    char *str = "First string"; 
    char *str2 = "Second string"; 

    strcpy(str, str2); 
    return 0; 
} 

Nó biên dịch chỉ tốt mà không có bất kỳ cảnh báo hay lỗi, nhưng khi tôi chạy ứng dụng Tôi nhận được rằng lỗi

Bus error: 10 

Những gì tôi bỏ lỡ?

+1

Vâng, 'strlen (str)

+29

Mọi người đều thiếu '# import'? !! –

+4

@SangeethSaravanaraj Vâng, tôi không thể tin được. lol Mọi người đều bỏ lỡ nó ... – Mysticial

Trả lời

34

Đối với một, bạn không thể sửa đổi chuỗi chữ. Đó là hành vi không xác định.

Để khắc phục mà bạn có thể làm cho str một mảng địa phương:

char str[] = "First string"; 

Bây giờ, bạn sẽ có một vấn đề thứ hai, đó là str là không đủ lớn để giữ str2. Vì vậy, bạn sẽ cần phải tăng chiều dài của nó. Nếu không, bạn sẽ vượt quá str - đó cũng là hành vi không xác định.

Để khắc phục sự cố thứ hai này, bạn cần phải thực hiện str ít nhất là miễn phí str2. Hoặc phân bổ nó tự động:

char *str2 = "Second string"; 
char *str = malloc(strlen(str2) + 1); // Allocate memory 
// Maybe check for NULL. 

strcpy(str, str2); 

// Always remember to free it. 
free(str); 

Có nhiều cách thanh lịch hơn khác để làm điều này liên quan đến Vlas (trong C99) và ngăn xếp phân bổ, nhưng tôi sẽ không đi vào những người như họ sử dụng là hơi có vấn đề.


Như @SangeethSaravanaraj chỉ ra trong nhận xét, mọi người bỏ lỡ #import. Nó phải là #include:

#include <stdio.h> 
#include <string.h> 
+15

Mystical, '# import' được hỗ trợ trong C cho cả clang và GCC, và là phần mở rộng target-c. Không có vấn đề với mã của OP, vì nó chỉ thêm tự động bao gồm bảo vệ và không có gì khác. –

5

str2 trỏ đến mảng ký tự liên tục được phân bổ tĩnh. Bạn không thể viết cho nó/qua nó. Bạn cần phân bổ động không gian thông qua nhóm các chức năng *alloc.

3

chuỗi ký tự không thể sửa đổi trong C

4

Mã của bạn cố ghi đè một chuỗi ký tự. Đây là hành vi không xác định.

Có một số cách để sửa lỗi này:

  1. sử dụng malloc() sau đó strcpy() sau đó free();
  2. biến str thành một mảng và sử dụng strcpy();
  3. sử dụng strdup().
7

Không có khoảng trống được phân bổ cho các chuỗi.sử dụng mảng (hoặc) con trỏ với malloc()free()

Ngoài ra

#import <stdio.h> 
#import <string.h> 

nên

#include <stdio.h> 
#include <string.h> 

LƯU Ý:

  • bất cứ điều gì đó là malloc() ed phải free() ' ed
  • bạn cần phải phân bổ n + 1 byte cho một chuỗi đó là chiều dài n (byte cuối cùng là cho \0)

Xin bạn đoạn mã sau để tham khảo

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(int argc, char *argv[]) 
{ 
    //char *str1 = "First string"; 
    char *str1 = "First string is a big string"; 
    char *str2 = NULL; 

    if ((str2 = (char *) malloc(sizeof(char) * strlen(str1) + 1)) == NULL) { 
     printf("unable to allocate memory \n"); 
     return -1; 
    } 

    strcpy(str2, str1); 

    printf("str1 : %s \n", str1); 
    printf("str2 : %s \n", str2); 

    free(str2); 
    return 0; 
} 
+1

+1 là người duy nhất nhận thấy '# import'. – Mysticial

4

này là vì str là trỏ đến một chuỗi chữ có nghĩa là một chuỗi liên tục ... nhưng bạn đang cố gắng sửa đổi nó bằng cách sao chép. Lưu ý: nếu nó có thể là một lỗi do cấp phát bộ nhớ, nó sẽ bị lỗi phân đoạn tại thời gian chạy. Nhưng lỗi này đến do sửa đổi chuỗi liên tục hoặc bạn có thể đi qua bên dưới để biết thêm chi tiết về lỗi bus abt:

Bus errors are rare nowadays on x86 and occur when your processor cannot even attempt the memory access requested, typically:

  • sử dụng một hướng dẫn xử lý với một địa chỉ không đáp ứng yêu cầu sự liên kết của nó.

Segmentation faults occur when accessing memory which does not belong to your process, they are very common and are typically the result of:

  • sử dụng một con trỏ đến một cái gì đó đã được deallocated.
  • bằng cách sử dụng con trỏ do đó không được khởi tạo.
  • bằng cách sử dụng con trỏ rỗng.
  • tràn bộ đệm.

Để chính xác hơn, điều này không thao túng chính con trỏ sẽ gây ra sự cố, nó truy cập vào bộ nhớ mà nó trỏ tới (dereferencing).

1

Bất cứ khi nào bạn đang sử dụng biến con trỏ (các Asterix) như

char *str = "First string";

bạn cần phải asign bộ nhớ để nó

str = malloc(strlen(*str))