这是我的代码:
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()
所需的内存(insidegenWord()
), - 或将缓冲区传递给
genWord()
(从genWord()
的外部),您将需要的数据复制到其中。
附带说明:所谓的 C 字符串是以零结尾的。也就是说,表示字符串的字符数组采用 NUL
字符(十进制 0
)作为其最后(终止)元素(其位置将由 的值索引) i
,而不是通过代码中的 wordLen
。
str*
函数族本质上依赖终止符 0
来确定字符串的“长度”。
因此,如果像 genWord()
那样逐个字符地构建字符串,请确保在完成后在最后一个元素之后添加终止符 0
。或者(虽然更昂贵,但也更方便)在使用之前用 0
初始化整个缓冲区。
关于c - 函数返回的字符串错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13902131/