为什么这个C程序会崩溃?没有报告错误

时间:2014-11-29 15:32:48

标签: c crash

所以我用C编写了这段代码,到目前为止,这部分应该打开一个图像并将每个像素复制到一个数组中。最后,我只是打印到屏幕上的一个像素值,看看它是否正常工作。问题是程序在运行时停止工作,并且不报告任何错误。

#define _CRT_SECURE_NO_DEPRECATE
#define width 256
#define height 128
#include <stdio.h>
#include <stdlib.h>

int main(){

FILE *fPointer;
int i=0, k=0; //i(height) and k(width) is the loop control variable.
int pixelArray[height][width][3];

fPointer = fopen("image01.red", "r");

for(i=0; i<height; i++){
    for(k=0; k<width; k++){
    fscanf(fPointer, " %d", pixelArray[height][width][1]);
    }
}
fclose(fPointer);
printf(" %d", pixelArray[1][1][1]);
}

此外,当我开始调试时,我收到此消息:0x5D38DE1B(msvcr110d.dll)处的未处理异常。

2 个答案:

答案 0 :(得分:3)

  

没有报告错误

编译器报告所有语法错误,以及逻辑中的一些易于检测的问题。众所周知,C允许您编译您认为有意义的内容,并且如果您的假设是错误的,请让代码崩溃。因此,不应该把“它编译”作为正确性的衡量标准。

在这种情况下,C允许您传递需要指针的值:

fscanf(fPointer, " %d", &pixelArray[i][k][1]);
//                      ^

scanf函数族总是带指针 - 这是C允许函数在调用者的上下文中修改某些东西的最常见方式。现代编译器会检查并发出警告。您应该注意所有这些警告,将它们视为错误。

在这种情况下,如果将-Wall标志传递给gcc,您会看到的具体警告将是

main.c:24:5: warning: format ‘%d’ expects argument of type ‘int *’, but argument 3 has type ‘int’ [-Wformat=]
     fscanf(fPointer, " %d", pixelArray[height][width][1]);

答案 1 :(得分:0)

您无法访问数组的heightwidth,因为它已超出范围。 fscanf取一个指针,然后在通话前添加一个&符号。

替换这个:

fscanf(fPointer, " %d", pixelArray[height][width][1]);

人:

fscanf(fPointer, " %d", &pixelArray[i][k][1]);