可能重复:
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;
}
答案 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);
答案 1 :(得分:2)
char *str = "NULL";
将str
声明为char指针,并使用只读的字符串文字“NULL”的地址对其进行初始化。修改字符串文字是一种未定义的行为,这就是你在strcat
中得到分段错误的原因(这反过来又是未定义行为的标志)。更不用说内存的初始分配('NULL'为4个字节+'0'为5个字节为1个字节)不适合附加字符串的连接。
而是使用malloc()动态分配内存,类似:
char *str=(char*) malloc(100*sizeof(char));
或者,如果你不想,你可以随时分配一个数组作为先前的答案说。
注意:如果动态分配内存,请在完成数据后忘记free(),否则程序会泄漏内存。如果您想了解有关动态分配内存的更多信息,可以参考here。