有人能告诉我我在这里做错了什么吗?为什么我的程序是segfault?
我试图在string1
和string2
之间插入第三个字符串。
#include <stdio.h>
int main (void)
{
char *string1 = "HELLO";
char *string2 = "WORLD";
char *stringX = "++++";
char *string3;
printf ("%s,%s\n",string1,string2);
sprintf(string3,"%s%s%s",string1,stringX,string2);
printf ("NewVar: %s",string3);
}
为什么
sprintf
不将结果值存储在string3
指向的内存地址?当我将string3
声明为普通数组时,它起作用,但当它是指向char
数组的指针时,它不起作用。我以为
string3
没有指向任何内存位置,但当我指向printf("%p",string3);
时,似乎确实指向输出:
# ./concat
HELLO,WORLD,0x40042
最佳答案
想象一下你有一堆现金要放在公文包里。你需要什么?你必须测量一下现金的大小才能知道公文包要用多大,而且你需要一个把手来方便地携带现金。
现金是你的钱。公文包是内存空间。公文包手柄是指针。
测量您的现金:strlen(string1) + strlen(string2) + strlen(stringX)
。
称之为“总计”。
现在准备一个足够大的公文包:malloc(total+1)
把把手放在上面:string3
把这些拼凑起来…
char *string3 = malloc(strlen(string1)+strlen(stringX)+strlen(string2)+1);
sprintf(string3, "%s%s%s", string1, stringX, string2);
那么第一次尝试有什么问题?你没有公文包。你有现金,你有把手,中间没有公文包。它似乎以一种随机的方式工作,因为编译器给了你一个脏垃圾桶来存放现金。有时候垃圾箱有空间,有时候没有。如果没有空间,我们称之为“分割错误”。
只要有数据,就必须为该数据分配空间。编译器为常量字符串分配空间,如
"HELLO"
。但是必须为运行时生成的字符串分配空间。