我的函数中有一个未使用的变量。如果我删除它,程序崩溃。我无法理解原因。我假设它是因为我访问了dataArr的界限。
定义: userFile是要读取的argv输入文本文件 dataArr是该文本文件的行,存储在字符串数组中。 n [80]是以前使用的指针数组,存储单个值(将其写入不同的函数) strdup复制字符串(非标准库)
如果有帮助,将n [80]的值切换为n [20]会产生错误,但n [21]不会。
display
编辑:
我使用
调用该函数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;
}
我养成了为函数使用相同变量名的坏习惯。
答案 0 :(得分:5)
这是因为数组会分配内存并修改程序的存储方式。
执行以下操作时会导致未定义的行为:
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) {
...
答案 1 :(得分:3)
这一行:
return dataArr;
会导致未定义的行为,这是您可能面临的最严重的问题。之所以如此糟糕是因为很多时候很难确定。 UD经常以奇怪的方式表现出来。
这与char * n[80]
完全无关。
简而言之,UD意味着任何都可能发生。有关详细信息,请参阅此链接:Undefined, unspecified and implementation-defined behavior