删除未使用的变量导致崩溃

时间:2018-05-29 09:01:35

标签: c

我的函数中有一个未使用的变量。如果我删除它,程序崩溃。我无法理解原因。我假设它是因为我访问了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;
}

我养成了为函数使用相同变量名的坏习惯。

2 个答案:

答案 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