Указатель C для структуры - ошибка сегментации - PullRequest
5 голосов
/ 15 ноября 2010

У меня проблемы с этой программой. Это очень просто. Мне нужно присвоить значения моей структуре из созданных мной указателей, но я продолжаю получать ошибку сегментации Есть идеи, что я делаю не так:

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

Ответы [ 3 ]

7 голосов
/ 15 ноября 2010

Вы присваиваете значения *p, *q и *r, но они не инициализируются: это указатели, указывающие на случайную память.

Их нужно инициализировать, либо назначивим новое значение, выделенное в куче (с malloc):

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

или указание на уже существующее значение:

int x;
int *p = &x;
*p = 1; // it's like doing x=1
6 голосов
/ 15 ноября 2010

Ваша проблема в том, что вы пишете в произвольных местах памяти, поскольку вы не инициализируете свои указатели и не выделяете память.

Вы можете сделать следующее:

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

Очевидно, вам нужно освободитьих, когда вы закончите, используя их:

free(p);
free(q);
free(r);
2 голосов
/ 15 ноября 2010

Вы не выделяете память для указателя.Поэтому когда вы делаете * p и * q и * r, вы разыменовываете нулевой указатель (или случайный указатель)Это приводит к ошибке сегментации.Используйте p = malloc (sizeof (int));когда вы объявляете переменные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...