2015-01-11 3 views
1

Я хочу использовать вложенные структуры с указателями в c. Я пишу этот код, но я не знаю, почему этот код не работает. на самом деле, как я могу выделить память для моей второй структуры?Вложенные структуры с указателем в C

#include <stdio.h> 
#include <stdlib.h> 
struct address 
{ 
    int code; 
    char city[10]; 
}; 
struct student { 
    char name[10]; 
    struct address *ads; 
} *person1; 

int main() 
{ 

person1 = malloc(sizeof(struct student)); 
scanf("%s", person1->name); 
scanf("%d", &person1->ads->code); 
scanf("%s", person1->ads->city); 

printf("%s", person1->name); 
printf("%d", person1->ads->code); 
printf("%s", person1->ads->city); 
return 0; 
} 

ПРИМЕЧАНИЕ: когда я использую «person1-> ads = malloc (sizeof (struct address));» программа столкнулась с проблемой и перестала работать.


[Обновление от комментариев:]

Я использую DEV C++ v5.4.2

+2

Вы не выделили память для элемента объявления. Поэтому вам нужно добавить что-то вроде person1-> ads = malloc (sizeof (struct address)); –

+0

я угадываю и тестирую .. но программа побежала до проблемы –

+0

Для этого макета я бы не стал называть «ads» указателем. Просто объявите его в 'struct student' как' struct address ads; 'и заполните его' person1-> ads.'. – WhozCraig

ответ

3

У вас есть несколько poblems

  1. Вы не проверить успешность malloc.
  2. Вы не malloc для person1->ads участник.
  3. Вы не проверяете успех scanf.

Это фиксированная и аннотированной версия кода

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

struct address 
{ 
    int code; 
    char city[10]; 
}; 

struct student 
{ 
    char name[10]; 
    struct address *ads; 
}; 

int main() 
{ 
    /* You don't need te struct to be global, and it's generally a bad idea, not always of course */ 
    struct student *person; 

    /* you should check that malloc succeeded otherwise undefined behavior would happen */ 
    person = malloc(sizeof(*person)); 
    if (person == NULL) 
    { 
     printf("cannot allocate memory\n"); 
     return -1; 
    } 

    /* you should check that scanf succeeded too */ 
    if (scanf("%9s", person->name) != 1) 
    /*  ^prevent buffer overflow */ 
    { 
     printf("Invalid, input\n"); 
     free(person); 
     return -1; 
    } 

    person->ads = malloc(sizeof(*(person->ads))); 
    if (person->ads == NULL) 
    { 
     printf("cannot allocate memory\n"); 
     /* on failure free successfuly allocated person */ 
     free(person); 
     return -1; 
    } 

    /* you should check that scanf succeeded too */ 
    if (scanf("%d", &person->ads->code) != 1) 
    { 
     printf("Invalid, input\n"); 

     free(person->ads); 
     free(person); 

     return -1; 
    } 

    /* you should check that scanf succeeded too */ 
    if (scanf("%9s", person->ads->city) != 1) 
    /*  ^prevent buffer overflow */ 
    { 
     printf("Invalid, input\n"); 

     free(person->ads); 
     free(person); 

     return -1; 
    } 

    printf("Name: %s\n", person->name); 
    printf("Code: %d\n", person->ads->code); 
    printf("City: %s\n", person->ads->city); 

    free(person->ads); 
    free(person); 

    return 0; 
} 
+0

спасибо !! приятные советы и рекомендации :) –

+0

1+ для сканирования с ограничениями ... :-) – alk

+0

@AmirMohammadNasrollahi عفوا –

3

Вы должны также выделить память для пользователей, сохраненных с помощью указателя.

int main() 
{ 
    person1 = malloc(sizeof(struct student)); 
    person1->ads = malloc(sizeof(struct address)); 
    scanf("%s", person1->name); 
    scanf("%d", &person1->ads->code); 
    scanf("%s", person1->ads->city); 

    printf("%s", person1->name); 
    printf("%d", person1->ads->code); 
    printf("%s", person1->ads->city); 
    free(person1->ads); 
    free(person1); 
    return 0; 
} 
+0

Я тестирую его, но все еще не работаю ... –

+0

@AmirMohammadNasrollahi, Измените 'int name [10];' на 'char name [10];' и он будет работать. –

+0

@CoolGuy ohhh извините !! ошибка от меня! :) –

3

как я могу выделить память для моей второй структуры?

Например, точно так же, как вы сделали для первой структуры: выделить его из кучи

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

struct address 
{ 
    int code; 
    char city[10]; 
}; 

struct student 
{ 
    char name[10]; 
    struct address * ads; 
}; 

int main(void) 
{ 
    struct student * person1 = malloc(sizeof * person1); 
    if (NULL == person1) 
    { 
    perror("malloc() failed for person1"); 
    } 
    else 
    { 
    person1->ads = malloc(sizeof * person1->ads); 
    if (NULL == person1->ads) 
    { 
     perror("malloc() failed for person1->ads"); 
    } 
    else 
    { 
     /* scan and print */ 

     free(person1->ads); 
    } 

    free(person1); 
    } 
} 
+0

okey я знаю !! но как? я тестирую много способов, и все они не работают! : D –

+0

@AmirMohammadNasrollahi: См. Мой обновленный ответ. – alk

+0

хороший способ, и я понимаю его, но все же проблема с идентификацией «person1-> ads» и прекращение работы. Я не знаю, почему действительно ваш код не работает в этом компиляторе. –

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