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

标签 c

我的函数中有一个未使用的变量。如果我删除它,程序就会崩溃。我很难理解为什么。我认为这是因为我访问的 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/

相关文章:

控制线程结束的顺序

c - 如何打印void * ioremap_nocache()的返回值?

c - 绑定(bind)套接字: SIGSEGV

c - 每次程序运行时输出都会改变(C pthread、信号量)

c - 在 ELF 可执行文件中检索 RELA 的符号名称

c - gdb打印双指针

c - 使用 C 无法从 TCP 套接字正确接收数据

c - 系统调用与函数调用

在 OpenGL 中更改投影

c - 套接字编程中的 bzero