1

可能重复:
为什么在写入字符串时会出现分段错误?

我正在编写一个非常简单的程序,我试图在 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;
}
4

2 回答 2

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);
于 2013-01-14T23:10:50.177 回答
2

char *str = "NULL";声明str为 char 指针,并使用只读的字符串文字“NULL”的地址对其进行初始化。修改字符串文字是一种未定义的行为,这就是为什么会出现分段错误strcat(这反过来又是未定义行为的标志)。更不用说内存的初始分配('NULL' 的 4 个字节 + '\0' 的 1 个字节 = 5 个字节)不适合附加字符串的连接。

而是使用malloc()动态分配内存,如下所示:

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

或者,如果您不想这样做,则始终可以像先前的答案所说的那样分配一个数组。

注意:如果您动态分配内存,请不要忘记在处理完数据后对其进行free(),否则您的程序会泄漏内存。如果您想了解更多关于动态分配内存的信息,可以参考这里

于 2013-01-14T23:11:30.193 回答