gpt4 book ai didi

c - 如何将 sprintf/snprintf 与双指针 char 数组一起使用

转载 作者:太空狗 更新时间:2023-10-29 15:31:09 25 4
gpt4 key购买 nike

下面的代码“应该”将字符串数组存储在变量 name 中,需要struct data 下。假设数组元素的数量是在运行时确定的,并且在下面的示例代码中,它们是用 DYNAMIC_ELEMENTS 定义的。字符串使用 sprintf 格式化。

#define DYNAMIC_ELEMENTS 10

struct data {
char **name;
};

int main()
{
struct data *data = calloc(1, sizeof(*data));
data->name = calloc(DYNAMIC_ELEMENTS, sizeof(data->name[0]));

for (int i = 0; i <= DYNAMIC_ELEMENTS; i++) {
sprintf(data->name[i], "Name %u", i + 1);
printf("%s\n", data->name[i]);
}
return 0;
}

当我运行这段代码时,出现段错误。错误来自行

sprintf(data->name[i], "Name %u", i + 1);

知道这里出了什么问题吗?

更新:如果我采用以下方法,代码符合要求(但我想避免这种情况):

//...
char buf[127];
sprintf(buf, "Name %u", i + 1);
data->name[i] = strdup(buf);
//...

最佳答案

这个:

i <= DYNAMIC_ELEMENTS

访问的内存超出了您分配的内存范围。你应该使用:

i < DYNAMIC_ELEMENTS

您还应该为每个单独的字符串分配内存:

data->name[i] = calloc(1, snprintf(NULL, 0, "Name %u", i + 1));

完整示例:

for (int i = 0; i < DYNAMIC_ELEMENTS; i++) {
data->name[i] = calloc(1, snprintf(NULL, 0, "Name %u", i + 1));
sprintf(data->name[i], "Name %u", i + 1);
printf("%s\n", data->name[i]);
}

这样做的原因:

//...
char buf[127];
sprintf(buf, "Name %u", i + 1);
data->name[i] = strdup(buf);
//...

是因为您正在使用 strdup 分配内存并将其分配给 data->name[i]

关于c - 如何将 sprintf/snprintf 与双指针 char 数组一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57383327/

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