Проблема при типизации указателя void *, используемого внутри структуры, на указатель int *! - PullRequest
0 голосов
/ 08 июня 2011

Мой код выглядит следующим образом:

#include<stdio.h>
struct data
{
    int a ;
    void *b;
};

int main()
{
    struct data *d;
    int *ptr;

    int key=10000;
    d->b=&key;

    ptr=(int *)d->b;
    printf("%d\n",*ptr);
}

И я получаю ошибку сегментации !!Есть идеи почему ??Заранее спасибо за любую помощь

Ответы [ 4 ]

5 голосов
/ 08 июня 2011

struct data *d просто объявляет указатель.Вы нигде не разместили эту структуру.Вам нужно либо malloc сделать это, либо объявить его как struct data d в стеке или глобально.

Первое можно сделать так:

d = malloc(sizeof(struct data));

Если вы выберете второедоступ к b должен быть записан как d.b.

3 голосов
/ 08 июня 2011

Вы получаете ошибку сегментации в строке d->b=&key; Обратите внимание, что у вас не выделена какая-либо ячейка памяти для структурной переменной d.Таким образом, d содержит некоторое значение мусора, а d->b пытается использовать этот адрес мусора для разыменования указателя и получения компонента b.Вот где вы получите Segfault.Либо статически размещайте переменную struct, либо используйте malloc для ее динамического выделения.

int main()
{
    struct data *d;
    int *ptr;

    /* Here you are allocating memory to the
     * pointer variable, which will be used to
     * point to the structure type data
     */
    d = malloc (sizeof (struct data)); 
    int key=10000;

    /* Now you can dereference the pointer 
     * and get any of the components of the
     * structure, because 'd' contains a valid
     * address.
     */ 
    d->b=&key;

    ptr=(int *)d->b;
    printf("%d\n",*ptr);

    /* Good practice to free the memory location
     * you have allocated. Not freeing will lead to
     * memory leak in larger applications. After you 
     * free the memory location denoted by the address
     * stored in 'd', you will not be anymore access 
     * the contents of it.
     */
    free (d);

    /* d->b; or d->a; is no more possible at this point
     * as we have freed the memory pointed by 'd'
     */
}

Или вы можете использовать:

int main()
{
    /* Not a pointer, statically allocated */
    struct data d;
    int *ptr;

    int key=10000;
    d.b=&key;

    ptr=(int *)d.b;
    printf("%d\n",*ptr);
}

Таким образом, это не приведение типов void * до int *, который вызывает ошибку.Это недопустимая ссылка на память переменной-указателя, которую вы использовали, но не распределили / инициализировали.

3 голосов
/ 08 июня 2011

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

Вы можете решить это так:

struct data *d = malloc(sizeof(*d));
2 голосов
/ 08 июня 2011

Проблема в том, что вы не выделили память для указателя объявления: struct data *d;.Эти строки только создают указатель, но не выделяют для него память.Пожалуйста, попробуйте следующий код:

int main()
{
    struct data *d = (struct data*)malloc(sizeof(struct data));
    int *ptr;
    int key=10000;
    d->b=&key;
    ptr=(int *)d->b;
    printf("%d\n",*ptr);
    free(d);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...