我的函数中有一个未使用的变量。如果我删除它,程序就会崩溃。我很难理解为什么。我认为这是因为我访问的 dataArr 超出范围。
对于定义: userFile 是要读取的 argv 输入文本文件 dataArr 是该文本文件的行,存储在字符串数组中。 n[80] 是以前使用的存储单个值的指针数组(将其写入不同的函数) strdup 重复字符串(非标准库)
如果有帮助,请将 n[80] 的值切换为 n[20] 会出现错误,但 n[21] 不会出现错误。
char ** read_file(char * userFile)
{
char * n[80]; // DO NOT REMOVE THIS LINE UNDER ANY CIRCUMSTANCES. IT IS BLACK VOODOO MAGIC.
char currLine[256];
char * dataArr[80];
char * eof;
int lineCount = 0;
int i = 0;
int j = 0;
FILE * fp;
fp = fopen(userFile, "r");
while((eof = fgets(currLine, sizeof(currLine), fp)) != NULL)
/* Stores the file into an array */
{
if (fp == NULL)
{
fprintf(stderr, "Can't open input file in.list!\n");
exit(1);
}
dataArr[i] = strdup(eof);
i++;
}
return dataArr;
}
编辑:
我使用
调用该函数 dataArr = read_file(argv[1]);
我有一个坏习惯,就是在函数中使用相同的变量名。
最佳答案
发生这种情况是因为数组分配内存并修改了程序的存储方式。
当您这样做时,您会导致未定义的行为:
return dataArr;
因为这个数组是一个局部变量:
char * dataArr[80];
因此,当函数终止时,它将超出范围。这意味着当调用者尝试使用它时,它很可能超出了范围。
<小时/>顺便说一句,您首先读取文件,然后检查它是否打开。你应该像这样:
fp = fopen(userFile, "r");
if (fp == NULL)
{
fprintf(stderr, "Can't open input file in.list!\n");
exit(1);
}
while((eof = fgets(currLine, sizeof(currLine), fp)) != NULL) {
...
关于c - 删除未使用的变量会导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50580324/