C sprintf 数组字符指针

标签 c arrays pointers

谁能告诉我我在这里做错了什么?为什么我的程序会出现段错误? 我正在尝试在 string1string2 之间插入第三个字符串。

#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 就是指针。

  1. 测量您的现金:strlen(string1) + strlen(string2) + strlen(stringX)。 称之为“总计”。
  2. 现在准备一个足够大的公文包:malloc(total+1)
  3. 并在其上放置句柄: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/

相关文章:

c - 在 C 中读取标准输入

c - 为什么这个程序不打印在我的文件上?

c - XCode:在 kext 中包含框架?

android - 如何解析 JSON 对象以获取数组中的数组?

C 编程字符数组或字符串作为函数参数

c - 指向结构体指针的内存分配

c - 使用 WinMain() 和 WindowProc() 建立窗口后,在哪里添加实际程序? (C++)

javascript - 将js数组分为2个部分

javascript - 从图像元素动态创建 Canvas 元素

c - C 中字符串的 printf 的意外输出