c - 在 C 中,我有一个从文件中读取的 char* 数组,当我通过引用将其从函数中传递出来时,我得到了垃圾

标签 c arrays string file char

我是 C 新手,主要使用 C++ 和 C#。现在我正在尝试编写一个从文件读取并将值存储在字符串中的函数,它在函数内工作,但是当我尝试将值传递出来时,它什么也没有或垃圾出来。我对 C 的工作原理有什么遗漏吗?这是出现问题的示例。

#include <stdlib.h>
#include <stdio.h>

void getArray(char**);

int main()
{
    char* myArr[2];
    getArray(myArr);
    for(int i = 0; i < 2; i++)
    {
        printf("%d\n", i);
        printf("%s\n", myArr[i]);
    }
    printf("printing done\n");
    return 0;
}

void getArray(char* arr[])
{
    arr[0] = "poo";

    char str[6];
    FILE* fp;

    fp = fopen("input.txt", "r");
    if(fp != NULL)
    {

         fscanf(fp,"%s",str);
         fclose(fp);

    }


    arr[1] = str;
    printf("%s\n", arr[1]);
}

这是代码,这是输出

123456
0
poo
1

printing done

这是预期的输出

123456
0
poo
1
123456
printing done

抱歉,如果我是多余的,我只是想彻底解决我的困惑

最佳答案

问题在于您将文件的内容保存到局部变量中。退出函数后局部变量将不再存在。

说明:

在 main 里面你有这个:

                   addr | var | value
                   ...  
                   0001 | --- | -----
inside main -->    0000 | arr | -----

当您进入函数时,局部变量将被推送到堆栈:

                    addr | var | value
                    ...  
inside function --> 0001 | str | -----
                    0000 | arr | -----

您读取 str 并将 arr 指向局部变量 str

                    addr | var | value
                    ...  
inside function --> 0001 | str | 123456
                    0000 | arr | points to 0001

当你离开函数时,str将从堆栈中删除

                    addr | var | value
                    ...  
                    0001 | --- | -----
after function  --> 0000 | arr | points to 0001

所以变量str不再存在,当你尝试执行arr[1]时,你会得到垃圾。

您可以动态地为变量分配空间,也可以将文件的内容直接加载到外部变量,确保它有足够的空间。

要动态分配 6 个字符的数组,请在函数内使用:char *str = malloc(6 * sizeof(char))

要使用外部变量,只需将 char str[6]; 移动到 main,并将其作为参数传递给函数: void getArray(char* arr[], char* str),这样您就可以更改 str 的值并仍然保留其值。

关于c - 在 C 中,我有一个从文件中读取的 char* 数组,当我通过引用将其从函数中传递出来时,我得到了垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46290067/

相关文章:

无法使用 open() 系统调用打开第二个文件

c++ - 一个有效的程序被 man7.org 宣布为无效

C 中的计数排序 - 错误 : Use of undeclared identifier

javascript - 如何返回一个列表,其中一个数组中的数据被另一个数组过滤

javascript - 是否可以将参数名称作为字符串形式的参数传递以用作函数中的参数名称?

ios - 由于条件绑定(bind)错误的初始化程序,无法将文本 append 到字符串数组

java - 如何在Delphi中将String转换为PWideString以供JNA使用

c - C语言编程中如何判断文件/目录是否隐藏

c++ - 如何在 "edit"按键上杀死 "Enter"控件的焦点

使用自定义键将一些值插入其中后,Javascript 数组似乎为空