2013-01-14 136 views
1

可能重複:
Why do I get a segmentation fault when writing to a string?麻煩簡單的字符串連接

我寫在那裏我試圖連接兩個字符串在for循環中一個非常簡單的程序。字符串連接中的第一個字符串是固定的,第二個字符串是通過使用itoa函數獲得的。該程序正在成功建立,但是當我嘗試運行程序時,它無法運行並停止。我只是調試程序,並在調試時意識到程序在字符串連接操作中陷入困境。我正在發佈下面的程序。感謝您的支持:

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

int main(int argc,char *argv[]) 
{ 
    char *str="NULL" ,dec[] = "NULL"; 
    int i,num; 

    printf("Enter a number : \n"); 
    scanf("%d",&num); 

    for (i=0;i<num;i++) 
    { str = "test_file_num_"; 
     itoa(i,dec,10); 
     strcat(str,dec); 
     printf("%s\n",str); 
    } 
return 0; 
} 

回答

2

寫入str是錯誤的,它的內存無法寫入。當你爲初學者做這個char *str="NULL"時,你只需要分配5個字節(當你開始連接時你將需要更多),而且你也在只讀存儲器上執行(可能在.data上,或者可能在.text上),在一些它會工作的情況下,但它是未定義的行爲。

如果您不能使用動態內存試圖做這樣的事情,而不是:

char str[128]="NULL" 

這在棧上分配128個字節(您可能需要不止於此)。這不是最好的方式,但它是解決問題的最小改變。

編輯:

這一行str = "test_file_num_"; 它指向str到一個字符串文字駐留在只讀存儲器同樣的問題。改變這個:

strcpy(str, "test_file_num_"); 

這將複製字符串文字到堆棧分配緩衝區。

最後,我想你應該只是這種替代循環內所有代碼:

printf("test_file_num_%d\n", i); 
+0

嗨! 感謝您的支持。當我將char * str聲明爲char str [128]時,我在語句str =「test_file_num_」中收到錯誤;並且錯誤是錯誤C2106:'=':左操作數必須是l值 – duttasankha

+0

更改'strcpy(str,「test_file_num _」);'。 – imreal

+0

完美!奇妙的作品。你是否會改變你的答案並添加這個答案,以便我可以接受它作爲答案。再次感謝。 – duttasankha

2

char *str = "NULL";聲明str的字符指針與字符串文字「NULL」,這是讀地址初始化只有。修改字符串文字是一個未定義的行爲,這就是爲什麼你在strcat(這反過來是一個未定義行爲的跡象)得到分段錯誤。更不用說,內存的初始分配('NULL'爲4字節,'\ 0'= 5字節爲1字節)不適合附加字符串的連接。

動態使用malloc(),類似的東西,而不是分配內存:

char *str=(char*) malloc(100*sizeof(char)); 

或者像前面的回答說,如果你不希望你總是可以分配一個數組。

注意:如果你動態分配內存不要忘記free()它完成後的數據,否則你的程序會泄漏內存。如果你想了解更多關於動態分配內存的信息,你可以參考here