gpt4 book ai didi

c - 函数返回的字符串错误

转载 作者:太空宇宙 更新时间:2023-11-04 05:28:47 24 4
gpt4 key购买 nike

这是我的代码:

char *genWord(int wordLen){
char array[wordLen + 1];
char *word;
int i;

for(i = 0; i <= wordLen; i++){
array[i] = 'a';
}

array[wordLen] = '\0';

//Test1 printf
printf("%s \n", array);

word = array;

//Test 2
printf("%s \n", word);

return word;
}

main(){
char *word;
int wordLen = 10;

word = (char *)genWord(wordLen);

//Test 3
printf("%s", word);
}

这是我在 Linux gcc 中执行的 3(相同程序)的输出:

第一:

aaaaaaaaaaaaaaaaaaaaa 
aaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaT��aaaaa

第二个:

aaaaaaaaaaaaaaaaaaaaa 
aaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaa�ƃ�aaaaa

第三:

aaaaaaaaaaaaaaaaaaaaa 
aaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaa����aaaaa

无法弄清楚哪里出了问题,更糟糕的是,无法想象我如何才能在每次运行时获得不同的输出?可变词不能在字符串的一部分中有垃圾,对吧?!

最佳答案

您返回对已在堆栈中分配的内存的引用 (array)。

当从 genWord() 返回时,该内存自动释放。

这就是返回的引用不再引用任何有效内存的原因。

解决这个问题

  • 动态分配 genWord() 所需的内存(inside genWord()),
  • 或将缓冲区传递给 genWord()(从 genWord()外部),您将需要的数据复制到其中。

附带说明:所谓的 C 字符串是以零结尾的。也就是说,表示字符串的字符数组采用 NUL 字符(十进制 0)作为其最后(终止)元素(其位置将由 的值索引) i,而不是通过代码中的 wordLen

str*函数族本质上依赖终止符 0 来确定字符串的“长度”。

因此,如果像 genWord() 那样逐个字符地构建字符串,请确保在完成后在最后一个元素之后添加终止符 0。或者(虽然更昂贵,但也更方便)在使用之前用 0 初始化整个缓冲区。

关于c - 函数返回的字符串错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13902131/

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