简单的字符串连接有问题

时间:2013-01-14 23:05:44

标签: c

  

可能重复:
  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 个答案:

答案 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