谁能告诉我我在这里做错了什么?为什么我的程序会出现段错误?
我正在尝试在 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
最佳答案
想象一下,您有一堆现金要放在公文包里。你需要什么?您必须测量现金的大小才能知道使用多大的公文包,并且您需要一个提手来方便携带现金。
现金就是您的字符串。公文包是存储空间。公文包 Handlebars 就是指针。
- 测量您的现金:
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);
那么第一次尝试出了什么问题?您没有公文包。你有现金,你有 Handlebars ,但中间没有公文包。它似乎以一种随机的方式工作,因为编译器给了你一个脏垃圾箱来存放现金。有时垃圾箱有空间,有时没有。如果没有,我们称之为“段错误”。
只要有数据,就必须为该数据分配空间。编译器为常量字符串分配空间,例如 "HELLO"
。但是您必须为在运行时构建的字符串分配空间。
关于C sprintf 数组字符指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19772667/