gpt4 book ai didi

C sprintf 数组字符指针

转载 作者:太空狗 更新时间:2023-10-29 16:42:07 26 4
gpt4 key购买 nike

谁能告诉我我在这里做错了什么?为什么我的程序会出现段错误?我正在尝试在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com