所以我用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)处的未处理异常。
答案 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)
您无法访问数组的height
和width
,因为它已超出范围。 fscanf
取一个指针,然后在通话前添加一个&符号。
替换这个:
fscanf(fPointer, " %d", pixelArray[height][width][1]);
人:
fscanf(fPointer, " %d", &pixelArray[i][k][1]);