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

在main中创建一个字符串数组,并将其传递给函数。此函数从文件读取字符串,并将文件的每一行存储在数组的另一行中。然后完成并返回到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
    }
}
jinjin1991 回答:C中的字符串数组:函数内正常,main()中充满垃圾

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

当前正在发生什么:

  1. createlist("file",list);根据值{strong> @Shark 通过list警告!
  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需要一个指针数组,但是您试图传递一个数组数组。还有其他问题,例如在指针数组中存储局部变量的地址-函数返回后将无效。

本文链接:https://www.f2er.com/2382618.html

大家都在问