gpt4 book ai didi

c - 将循环中的值分配给字符指针数组

转载 作者:太空宇宙 更新时间:2023-11-04 06:04:16 26 4
gpt4 key购买 nike

我无法在循环中为 char 数组赋值,因为它在每个数组值中都包含相同的值

例如这个有效

char* foo[3];

foo[0] = "mango"; foo[1] = "kiwi"; foo[2] = "banana";

int i=0; for(i=0;i<3;i++)
{
printf("%s\n",foo[i]);
}

但这并没有,我不明白为什么。

char* foo[3]; int i=0;

for(i=0;i<3;i++) {
char temp[5];
sprintf(temp,"VAL:%d",i);
foo[i] = temp;
}

for(i=0;i<3;i++)
{
printf("%s\n",foo[i]);
}

请帮助并提前致谢

最佳答案

第二个片段中的问题是 foo 中的所有元素都指向同一个变量 temp,当第二个 for 被执行,这是未定义的行为。即使它没有超出范围,foo 中的所有元素也会指向同一个缓冲区,这是不正确的。

要更正,您需要复制temp 并将其存储在foo 的每个元素中。如果可用,这可以通过使用 strdup() 来实现(如果没有 malloc()strcpy()):

for (i = 0; i < sizeof(foo)/sizeof(foo[0]); i++)
{
char temp[6];
snprintf(temp, sizeof(temp), "VAL:%d", i);
foo[i] = strdup(temp); /* Must be free()d later. */
}

或更改 foo 的类型(正如 unwind 所建议的那样):

char foo[3][6];
int i;
for (i = 0; i < sizeof(foo)/sizeof(foo[0]);i++)
{
snprintf(foo[i], sizeof(foo[i]), "VAL:%d", i);
}

其他变化:

  • temp 的大小增加到 6,因为它需要 5 个字符 VAL:%d plus sprintf() 附加的空终止符。因此,发布的代码存在缓冲区溢出。
  • 使用snprintf()以避免缓冲区溢出。
  • 使用 sizeof(foo)/sizeof(foo[0]) 计算数组 foo 中的元素数量,而不是对元素数量进行硬编码。<

关于c - 将循环中的值分配给字符指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13271168/

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