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. :(
Sie vergeben niemals Speicher für 'instance'. Bevor Sie versuchen, die Breite zu setzen, tun Sie: 'instance = malloc (sizeof * instance);' – Tibrogargan
@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
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