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

标签 c memory-management

这是我的代码:

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/

相关文章:

C三元-If无返回值

python 线程内存使用 64 位与 32 位

c - 如何在 C 的 fortran 例程 "called"中分配一个数组

c++ - 从长 vector 中释放内存

java - 重新实现 "ToneMatrix"音频玩具

C 找不到在不同情况下从文件读取数据的工作算法

c - C语言中查找链表中的函数

c++ - 将 char * 转换为 LPWSTR

c - 动态改变C中数据结构元素的数组大小

c - 如何将 2 个 char 变量组合并存储在一个整型变量中?