2009-11-06 2 views
0

Я компилирую этот кусок кода, и я получаю ошибки компиляции, говоря «указатель разыменования неполного типа». Я получаю ошибки для последнего оператора печати и до этого, где я пытаюсь указать (* temp). Num по адресу бВопрос об указателях структуры ссылки на ссылки

void main() 
{ 

    struct { 
     int xx; 
     char *y; 
     int * num; 
     struct x *next; 
    }x; 

    struct x* temp; 
    int b = 10; 

    temp = ((struct x *)malloc(sizeof(x))); 

    (*temp).num = &b; 

    x.next = temp ; 

    printf(" %d\n",temp->num, x.next->num); 

} 
+1

'главный()' возвращает Int. Для того, чтобы сделать вашу программу более портативного использования 'INT основной (недействительным) {/ * ... * /}'. И вам не нужно указывать возвращаемое значение 'malloc()', гораздо лучше '#include '. И '(* temp) .num' может быть написано' temp-> num'. – pmg

+1

Oh. .. и ваш 'printf' ожидает 1 аргумент, кроме строки формата, и вы передаете его. 2. – pmg

+1

Вы не должны указывать возвращаемое значение malloc(), в C. – unwind

ответ

5

Проблема в том, что заявление:

struct { 
    ... 
} x; 

определяет безымянный экземпляр «х» - не именованный тип «х».

Итак, когда вы ссылаетесь на «struct x» внутри, все компиляторы знают, что вам нужен какой-то указатель типа «x», который вы определите позже (и вы никогда этого не сделаете).

Для определения имени типа «х» вам нужно:

struct x { 
    ... 
}; 
+0

Это не определяет именованный тип «x» - это просто тег структуры. Чтобы определить именованный тип, вам понадобится typedef. – Draemon

+0

@Draemon - Частично верно - он определяет структуру с именем «x» ... В прямом C вы не можете использовать «x» без части «struct», но она по-прежнему называется в отличие от OP, когда она была неназванной. – Aaron

+1

@Aaron: Он определяет структуру с именем «struct x», а не тип, который является структурой, которая называется «x». Структуры теги и имена типов являются различными пространствами имен, в С. – unwind

0

Я думаю, что вы имели в виду:

struct x { 
    int xx; 
    char *y; 
    int * num; 
    struct x *next; 
}x; 

Вы ссылаетесь на «STRUCT тег», который вы не определили, где вы используете struct x. У вас нет способа ссылаться на тип переменной x. Поскольку вы хотите обратиться к нему с помощью struct x, вы должны определить тег struct.

0

Я думаю, что это факт, что ваша структура относится к себе, прежде чем она будет полностью определена.

В частности, ваша структура не имеет имени; «x» - это имя переменной, имеющей такую ​​структуру, но имя типа отсутствует.

Просто объявите «struct x { ... } x», и все должно быть хорошо.

0

Кроме того, что Draemon пишут о struct x {...} x, я взял на себя смелость коррекции различных других мелких проблем, как printf():

void main() 
{ 
    struct x { 
    int xx; 
    char *y; 
    int *num; 
    struct x *next; 
    } x; 
    struct x* temp; 
    int b = 10; 
    temp = ((struct x *)malloc(sizeof(struct x))); 
    (*temp).num = &b; 
    x.next = temp ; 
    printf("%d %d\n",*temp->num, *x.next->num); 
} 

Просто из любопытства: Что вы пытаетесь достичь?

0

Обратите внимание, что void main() не был действительным прототипом для main в C или C++.

Если вы хотите указатель на struct, который вы декларируете в пределах struct, вам необходимо пометить struct. typedef иногда полезен, но не нужен.

Просьба изучить различия между вашим кодом и следующим и понять, почему существуют различия. Это поможет вам учиться. Так будет чтение C FAQ list (например, см Structures, Unions, and Enumerations.

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

int main(void) { 
    int b = 10; 

    typedef struct x_struct { 
     int xx; 
     char *y; 
     int *num; 
     struct x_struct *next; 
    } x; 

    x *temp = malloc(sizeof(*temp)); 
    if (!temp) { 
     return EXIT_FAILURE; 
    } 

    temp->num = &b; 
    temp->next = temp; 

    printf("%d %d\n", *(temp->num), *(temp->next->num)); 
    return 0; 
} 
+0

Привет, В коде, вы хотите сказать x_struct * температура = таНос .. вместо х * = температура таНос ... Просьба уточнить , Также, если вы можете взглянуть на комментарий, который я добавил наверху (для вопроса), подытоживая мое понимание. Если у вас есть быстрый взгляд, будет отлично Спасибо. – user193891

+0

Я имел в виду 'x * temp = malloc (...)'. 'struct x * temp' было бы хорошо. Однако почему бы не использовать 'typedef' теперь, когда мы его typedef'ed? –

Смежные вопросы