2016-10-17 3 views
2

Dies ist in einem Programm vorgesehen, das mit ppm-Bilddateien arbeiten soll.c - Segmentierungsfehler bei Verwendung der globalen Strukturvariablen

Ich bekomme einen Segmentierungsfehler, wenn ich versuche, ein Bild aus einer Datei zu lesen und dieses Bild meinem globalen Strukturbild zuzuordnen.

Dies sind die relevanten Teile meiner ppmIO.c Datei:

#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); 

} 

Das ist meine ppmIO.h Datei:

#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 */ 

Und dies ist der Segmentierungsfehler, dass GDB berichtet:

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000400fff in ImageRead (filename=0x7fffffffdc32 "nika.ppm") 
    at ppmIO.c:126 
126 instance->width = width; 

Ich denke, es gibt ein Problem mit, wie ich versuche, die Image *instance zu verwenden ... aber ich reall Sie haben keine Ahnung, was dieses Chaos verursacht. :(

+3

Sie vergeben niemals Speicher für 'instance'. Bevor Sie versuchen, die Breite zu setzen, tun Sie: 'instance = malloc (sizeof * instance);' – Tibrogargan

+0

@Tribrotargan Wenn ich versuche, Speicher wie folgt zu reservieren: 'struct Image * instance = (Image *) malloc (sizeof (Image)); ' Ich bekomme einen Fehler und der Code kompiliert nicht. Der Fehler: 'ppmIO.c: 14: 27: Fehler: 'Bild' hier nicht deklariert (nicht in einer Funktion) struct Image * instance = (Bild *) malloc (sizeof (Image)); ^ ppmIO.c: 14: 34: Fehler: erwarteten Ausdruck vor ')' Token struct Bild * instance = (Bild *) malloc (sizeof (Bild)); ' – RockAndaHardPlace

+1

Ja," Bild "existiert nicht, Sie Möchte 'struct Image' oder einen Typedef hinzufügen. Und werfen Sie nicht den Rückgabewert von malloc aus. – Tibrogargan

Antwort

2

Sie bekommen diesen Fehler wie jeden anderen Speicher nicht zugeordnet haben für instance Bevor Sie Mitglied der Instanz versuchen und verwenden (dh width oder data) müssen Sie Speicher reservieren (von innerhalb einer Funktion), dh.:

instance = malloc(sizeof *instance); 

Sie nicht den Rückgabewert der Instanz werfen sollen (siehe: this), und es gibt keine Notwendigkeit, die Art angeben, da die Compiler bereits wissen, Sie können nicht den Speicher zuweisen, wenn Sie die Variable deklarieren. Statische Initialisierungen müssen auf konstante Werte erfolgen (siehe: this) (der Rückgabewert einer Funktion ist nicht konstant)

Sie müssen auch Speicher für den instance->data Teil der Struktur reservieren, basierend auf der Größe, die Sie aus der Datei gelesen haben.

Verwandte Themen