5 Stimmen

C-Zeiger für Struct - Segmentierungsfehler

Ich habe Probleme mit diesem Programm. Es ist sehr einfach. Ich muss meiner Struktur Werte aus den Zeigern zuweisen, die ich erstellt habe, aber ich erhalte ständig einen Segmentierungsfehler. Irgendwelche Ideen, was ich falsch mache:

#include <stdio.h>
#include <stdlib.h>

struct problem37
{
    int a;
    int b;
    int c;
};

int main()
{
    printf("Problem 37\n");

    //create struct
    struct problem37 myStruct;

    //create the pointer
    int* p;
    int* q;
    int* r;

    *p = 1;
    *q = 5;
    *r = 8;

    //read the data into the struct using the pointers
    myStruct.a = *p;
    myStruct.b = *q;
    myStruct.c = *r;

    printf("%d\n", myStruct.a);
    printf("%d\n", myStruct.b);
    printf("%d\n", myStruct.c);

    return 0;
}

7voto

peoro Punkte 24751

Sie ordnen einen Wert zu *p , *q y *r , aber sie sind nicht initialisiert: Sie sind Zeiger, die auf einen zufälligen Speicher verweisen.

Sie müssen sie initialisieren, indem Sie ihnen entweder einen neuen Wert auf dem Heap zuweisen (mit malloc ):

int *p = (int*) malloc( sizeof(int) );
*p = 1;

oder sie auf einen bereits vorhandenen Wert verweisen lassen:

int x;
int *p = &x;
*p = 1; // it's like doing x=1

6voto

ThiefMaster Punkte 297146

Ihr Problem ist, dass Sie an zufälligen Speicherstellen schreiben, da Sie Ihre Zeiger nicht initialisieren und keinen Speicher zuweisen.

Sie könnten Folgendes tun:

int* p = malloc(sizeof(int));
int* q = malloc(sizeof(int));
int* r = malloc(sizeof(int));

Natürlich müssen Sie sie nach der Benutzung wieder freigeben:

free(p);
free(q);
free(r);

2voto

Sie ordnen dem Zeiger keinen Speicher zu. Wenn Sie also *p und *q und *r ausführen, dereferenzieren Sie einen Null-Zeiger (oder einen beliebigen Zeiger). Dies führt zu einem Segmentierungsfehler. Verwenden Sie p = malloc(sizeof(int));, wenn Sie die Variablen deklarieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X