2016-10-17 8 views
2

これは、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)を試してみて、使用する前に、このエラーを取得している

+3

あなたは決して 'instance'のためのメモリを割り当てません。 'instance = malloc(sizeof * instance);' – Tibrogargan

+0

@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

+1

「Image」は存在しません。 'struct Image'が必要な場合や、typedefを追加する場合。 mallocの戻り値をキャストしないでください。 – Tibrogargan

答えて

2

あなたは(関数内から)メモリを割り当てる必要があり、すなわち。: 、およびコンパイラは、すでにあなたが変数として宣言するときは、メモリを割り当てることができません知っているので、型を指定する必要はありません。

instance = malloc(sizeof *instance); 

あなたは、インスタンスの戻り値をキャストしてはならない(thisを参照してください)。静的な初期化は定数値にする必要があります(thisを参照)(関数の戻り値は一定ではありません)

また、ファイルから読み取ったサイズに基づいて、構造の一部分のためにメモリを割り当てる必要があります。

関連する問題