【发布时间】:2015-10-16 00:45:53
【问题描述】:
我试图通过终端运行这个程序,但出现了这个错误。 “分段错误:11”
我想知道为什么。这个程序所做的是,它读取一个 .ppm 文件并将其信息保存在 Pixel 类型的矩阵变量中,因此,PPM 文件基本上由以下部分组成:第一行默认为“P3”,第二行矩阵的大小,第三行是像素属性可能的最大值,其他行将有 3 个最大值为 255 的整数,因此对于矩阵的每个成员,将有一个像素 R、G、B。 我在函数 save_image 中尝试做的事情,首先识别我们是否正在处理 ppm 文件(检查第一行中是否有 P3),然后读取矩阵的行数和列数,然后创建一个新的使用 malloc 函数的矩阵,然后它将文件行中的数据保存到变量 myImg 的 .r 和 .g 和 .b 中。 我对调试/编程非常陌生,所以如果信息不足,我很抱歉,但我已尽力而为。
#include <stdio.h>
#include <stdlib.h>
typedef struct{
int r;
int g;
int b;
}Pixel;
void save_image(FILE* img, Pixel ** newImg) {
int i;
int j;
int fcount;
int scount;
int count;
int dcc;
char init[3];
fscanf(img,"%s",init);
if(init[0]=='P' && init[1]=='3'){
printf("worked!\n");
fscanf(img,"%d %d",&j,&i);
fscanf(img, "%d",&dcc);
*newImg = (Pixel*)malloc(sizeof(Pixel) * i);
for ( count = 0; count < i ; ++count)
{
newImg[count] = (Pixel*)malloc(sizeof(Pixel) * j);
}
for (fcount = 0; fcount <= i ; ++fcount)
{
for (scount = 0; scount <= j; ++scount)
{
fscanf(img,"%i %i %i",&newImg[i][j].r,&newImg[i][j].g,&newImg[i][j].b);
}
}
}
else
printf("Type of file not recognized\n");
fclose(img);
}
int main(int argc, char const *argv[])
{
FILE* image;
Pixel myImg;
Pixel** newImg;
**newImg = myImg;
image = fopen(argv[1],"r");
save_image(image,newImg);
return 0;
}
【问题讨论】:
-
ppm 文件示例pastebin.com/9vvtqwH5
-
1) 发布的代码编译不干净。 2) 在访问 argv[0] 之外的任何 argv[] 条目之前,始终检查 argc 的值以确保实际输入了命令行参数。如果未输入,则输出“使用”语句并退出。 3)变量
newImg在初始化之前在main()中使用。编译时始终启用所有警告,然后修复警告。 (对于 gcc,至少使用:-Wall -Wextra -pedantic) -
调用函数:
fscanf()时,一定要检查返回值(不是参数值),保证操作成功 -
命名变量时,使用有意义的名称。 'i' 和 'j' 对于循环计数器可能没问题,但对于
row width和number of rows in image来说毫无意义 -
强烈建议,为了省去很多麻烦,在
save_image()函数中声明 newImg 并将结果指针传递回 main() 而不是在 main() 中声明 newImg 并将地址传递给 as save_image() 的参数。因此,这一行:*newImg = (Pixel*)malloc(sizeof(Pixel) * i);(无论如何都不正确)应该是:Pixel **newImg = malloc(sizeof(Pixel*) * i);在 C 中,不要从 malloc()(和函数族)转换返回值,因为它是void *,所以可以分配给任何其他指针。
标签: c file memory allocation