【问题标题】:Array of string in C: OK within a function, full of garbage in main()C中的字符串数组:函数内正常,main()中充满垃圾
【发布时间】:2020-04-22 15:20:12
【问题描述】:

在 main 中创建一个字符串数组并传递给一个函数。此函数从文件中读取字符串并将文件的每一行存储在数组的不同行中。然后完成并返回主程序。如果我在函数内 printf 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
    }
}

【问题讨论】:

  • 考虑到您将不兼容的类型传递给函数的 list 参数,我真的很惊讶编译器会允许代码。
  • 你不应该通过&amp;list吗?
  • 您是否收到任何编译器警告?
  • @Shark 不,这也是错误的。参数应为char mylist[3000][40]char mylist[][40]
  • 大家好,没有编译器警告,很奇怪。最后,我更正了@Jabberwocky 和 ​​Vorac 所说的内容,并且效果很好。非常感谢!

标签: c arrays string garbage


【解决方案1】:

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

目前正在发生的事情:

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

【讨论】:

  • 这只是故事的一半,除非mylist 参数的类型被更正,否则strcpy() 不会编译。
  • 奇怪的是,它可以“按原样”编译(我使用的是 MS Visual Studio,我知道这可能很奇怪)。 @Vorac,在更改您所说的内容并更正 Jabberwocky 指出的类型后,它可以正常工作。非常感谢!
  • @CarpoCrates 你应该投票和/或接受答案
  • 你不能将数组作为参数传递给函数——编译器会在你背后转换成一个指针,这很令人困惑。
  • @Jabberwocky 抱歉,我是这里的新手。不知道那件事。我已经接受了解决方案。感谢您的建议。
【解决方案2】:

编译你的代码会给出警告:

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 需要一个指针数组,但您试图传入一个数组数组。还有其他问题,比如在你的指针数组中存储一个局部变量的地址——函数返回后会失效。

【讨论】:

  • 谢谢,我终于更正了代码,它工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多