2012-01-03 196 views
30

這裏是我的代碼總線錯誤:10錯誤

#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; 
} 

它編譯就好了,沒有任何警告或錯誤,但是當我運行的應用程序,我得到這個錯誤

Bus error: 10 

我錯過了什麼?

+1

好,'strlen的(STR) 2012-01-03 18:11:26

+29

每個人都缺少'#import'嗎?!! – 2012-01-03 18:18:23

+4

@SangeethSaravanaraj是的,我無法相信它自己。大聲笑大家都錯過了它...... – Mysticial 2012-01-03 18:24:01

回答

34

其中之一,你不能修改字符串文字。這是未定義的行爲。

爲了解決這個問題,你可以讓str本地陣列:

char str[] = "First string"; 

現在,你將有第二個問題,就是str是不是大到足以容納str2。所以你需要增加它的長度。否則,您將超出str - 這也是未定義的行爲。

要解決第二個問題,您需要製作str至少與str2一樣長。或者動態地分配它:

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); 

還有其他更優雅的方式來做到這一點涉及沃拉斯(以C99)和堆棧分配,但我不會去到那些爲他們的使用是有點懷疑。


由於@SangeethSaravanaraj在評論中指出,每個人都錯過了#import。它應該是#include

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

神祕的,C中支持clang和GCC的'#import',並且是一個Objective-C的擴展。 OP的代碼沒有問題,因爲它只添加了自動包含警衛而沒有其他任何內容。 – 2013-01-29 01:33:11

5

str2指向一個靜態分配的常量字符數組。你不能寫信給它。您需要通過*alloc函數系列動態分配空間。

3

字符串文字在C中是不可修改的

4

您的代碼嘗試覆蓋字符串文字。這是未定義的行爲。

有幾種方法來解決這個問題:

  1. 使用malloc()然後strcpy()然後free();
  2. str轉成數組並使用strcpy();使用strdup()
7

沒有空間分配給字符串。使用陣列(或)指針與malloc()free()

除此之外

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

應該

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

注:

  • 東西都malloc() ED必須free()「編號
  • 您需要分配n + 1字節的字符串,它的長度是n的(最後一個字節是\0

請您將以下代碼作爲參考

#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是唯一注意'#import'的人。 – Mysticial 2012-01-03 18:38:44

4

這是因爲str爲指向一個字符串字面意味着一個常量字符串......但你試圖通過複製來修改它。 注意:如果這是由於內存分配導致的錯誤,它將在運行時給出分段錯誤。但是由於字符串修改不斷,可能會出現此錯誤,或者您可以通過以下方式瞭解更多詳細信息abt bus error:

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

  • 使用具有不滿足 其對準要求的地址的處理器指令。

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

  • 使用指針的東西,被釋放。
  • 使用未初始化的僞指針。
  • 使用空指針。
  • 溢出緩衝區。

更確切地說,這不是操縱指針本身,它會導致問題,它訪問它指向的內存(解除引用)。

1

每當你使用指針變量(星號),如

char *str = "First string";

需要ASIGN內存給它

str = malloc(strlen(*str))