0

这是我的代码:

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   

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

4

2 回答 2

4

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

genWord().

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

要解决此问题

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

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

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

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

于 2012-12-16T14:20:24.563 回答
3

您正在返回本地地址,不再保证在调用返回后分配。因此,这是一种未定义的行为。

当你这样做word = array时,数组的本地地址被复制到word变量中。返回后调用函数有地址,这是函数中的本地地址。但是在函数返回之后,地址不再有效,并且可能被分配用于其他目的,或者被覆盖或其他任何东西。

word = strdup (array);

word = malloc (sizeof (char) * (strlen (array) + 1));
strcpy (word, array);
return word;
于 2012-12-16T14:31:48.980 回答