これは、ppmイメージファイルで動作するプログラムに含まれています。c - グローバル構造変数を使用しているときのセグメンテーションエラー
ファイルからイメージを読み込み、そのイメージをグローバル構造イメージに割り当てようとすると、セグメンテーション違反が発生します。
これらは私のppmIO.cファイルの関連する部分です:
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <ppmIO.h>
struct Image *instance;
void ImageRead(char *filename)
{
printf("hi 0!");
int width, height, num, size;
//unsigned char *p;
//Image *image = (Image *) malloc(sizeof(Image));
FILE *fp = fopen(filename, "r");
//if (!image) die("cannot allocate memory for new image");
if (!fp) die("cannot open file for reading");
readPPMHeader(fp, &width, &height);
size = width * height * 3;
printf("hi!");
//instance->data = (unsigned char *) malloc(size);
printf("hi 2!");
instance->width = width;
printf("hi 3!");
instance->height = height;
printf("hi 4!");
if (!instance->data) die("cannot allocate memory for new image");
num = fread((void *) instance->data, 1, (size_t) size, fp);
if (num != size) die("cannot read image data from file");
fclose(fp);
}
これは私のppmIO.hファイルです:
#ifndef PPMIO_H
#define PPMIO_H
struct Image
{
int width;
int height;
unsigned char *data;
};
extern struct Image *instance;
//extern Image *ImageCreate(int width, int height);
//extern void ImageClear(struct Image *image, unsigned char red, unsigned char green, unsigned char blue);
extern void ImageRead(char *filename);
extern void ImageWrite(char *filename);
extern void ImageSetPixel(int x, int y, int chan, unsigned char val);
extern unsigned char ImageGetPixel(int x, int y, int chan);
#endif /* PPMIO_H */
そして、これは、GDBレポートセグメンテーションフォールトです:
をProgram received signal SIGSEGV, Segmentation fault.
0x0000000000400fff in ImageRead (filename=0x7fffffffdc32 "nika.ppm")
at ppmIO.c:126
126 instance->width = width;
私は、どのように私がImage *instance
を使用しようとしているかに問題があると思います...しかし、私はこの混乱の原因となっているものは本当の手がかりがありません。 :(あなたがinstance
のための任意のメモリを割り当てられていないとして、あなたは、インスタンスの任意のメンバー(すなわちwidth
またはdata
)を試してみて、使用する前に、このエラーを取得している
あなたは決して 'instance'のためのメモリを割り当てません。 'instance = malloc(sizeof * instance);' – Tibrogargan
@Tibrogarganこのようにメモリを割り当てようとすると、 'struct Image * instance =(Image *)malloc(sizeof(Image) )); ' エラーが発生し、コードがコンパイルされません。エラー: 'ppmIO.c:14:27:エラー:ここで宣言されていない 'Image'(関数内ではない) struct Image * instance =(Image *)malloc(sizeof(Image)); ^ ppmIO.c:14:34:エラー: ')'トークンの前に予期される式 struct Image * instance =(Image *)malloc(sizeof(Image)); ' – RockAndaHardPlace
「Image」は存在しません。 'struct Image'が必要な場合や、typedefを追加する場合。 mallocの戻り値をキャストしないでください。 – Tibrogargan