我是 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/