2013-01-14 97 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