C 中的字符串数组:函数内正常,main() 中充满垃圾

Array of string in C: OK within a function, full of garbage in main()

在 main 中创建了一个字符串数组并传递给了一个函数。此函数从文件中读取字符串并将文件的每一行存储在数组的不同行中。然后完成并 returns 到 main。如果我在函数内打印 array[i] 的内容,屏幕上显示的文本就可以了。如果我在返回 main() 后执行相同操作,则 printf 只会写入垃圾。为什么 main() 不访问数组内存位置的内容?

void createlist(char* file, char **mylist) {

    FILE* stream;
    char name[40];
    int i = 0;

    stream = fopen(file, "r");      

    while (fgets(name, sizeof(name), stream) != NULL) { 

        mylist[i] = name;
        printf(mylist[i]);   // <------------------------This works OK! 
        i++;
    }
    fclose(stream);
}

void main(int argc, char* argv[]) {

    char list[3000][40]; 
    int i = 0;
    resetchararray(list, 3000);

    createlist("file", list);   

    for (i = 0; i < 3000; i++) {
        printf(list[i]);    // <---------------------This writes garbage
    }
}

name 是函数中的局部变量。它在函数结束后消失,只留下垃圾。要实现您正在尝试的目标,请使用 strcpy(),而不是 mylist[i] = name;

当前发生的事情:

  1. createlist("file", list); 按值传递 list @Shark 警告!
  2. mylist[i] = name; 使 mylist[i] 保存局部变量的地址!
  3. createlist() 终止,仅更改了 list 的本地副本(参见第 1 点)

编译你的代码给出警告:

program.c:26:24: warning: passing argument 2 of ‘createlist’ from incompatible pointer type [-Wincompatible-pointer-types]
     createlist("file", list);   
                    ^
program.c:3:6: note: expected ‘char **’ but argument is of type ‘char (*)[40]’
 void createlist(char* file, char **mylist) {

它告诉您您遇到的问题之一是——您传递给 createlist 的指针类型错误。如声明的那样,createlist 需要一个指针数组,但您试图传入一个数组数组。还有其他问题,比如在你的指针数组中存储局部变量的地址——在函数 returns.

之后将无效