2010-11-14 20 views
5

Mam problemy z tym programem. To bardzo proste. Muszę przypisać wartości do mojej struktury z utworzonych wskaźników, ale wciąż dostaję błąd segmentacji. Wszelkie pomysły, co robię źle:C Wskaźnik dla Struct - błąd segmentacji

#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; 
} 
+1

i gdzie czy myślisz, że twoje wskazówki wskazują? – ruslik

Odpowiedz

6

Twoje są przypisanie wartości do *p, *q i *r, ale nie są inicjowane: są wskaźnikami wskazującymi losową pamięć.

Trzeba je zainicjować, bądź przypisując im nową wartość przydzielonego w stercie (z malloc):

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

lub czyniąc je wskazują na wartości już istniejącej:

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

Nie przypisujesz pamięci do wskaźnika. Dlatego, gdy robisz * p i * q oraz * r, usuwasz zerowy wskaźnik (lub losowy wskaźnik). Prowadzi to do błędu segmentacji. Użyj p = malloc (sizeof (int)); kiedy deklarujesz zmienne.

6

Twój problem polega na tym, że zapisujesz losowo lokalizacje w pamięci, ponieważ nie inicjalizujesz wskaźników ani nie alokujesz pamięci.

Można wykonać następujące czynności:

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

Oczywiście trzeba je uwolnić po zakończeniu korzystania z nich:

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