2016-04-29 6 views
1

Я изучаю указатель на структуру в с и я сделал этот код для обучения:указателя на структуру в C

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

typedef struct 
{ 
    int id; 
    char *name; 
}struct_type_t; 

void set_struct(struct_type_t **); 

int main(int argc, char *argv[]) 
{ 
    struct_type_t *m = NULL; 

    set_struct(&m); 

    printf("%d\n", m->id); 
    //fflush(stdout); 
    printf("%s\n", m->name); 
    return 0; 
} 

void set_struct(struct_type_t **m) 
{ 
     struct_type_t t; 
     *m = &t; 

     (*m)->id = 5; 
     (*m)->name = "Pointer To Structure"; 
} 

Функция set_struct предназначена для установки элементы этой структуры, передавая адрес указателя к структуре struct_type *m к функции.

но в строке printf в основной функции он не печатает член строки name структуры, вместо этого он печатает только целочисленный элемент id.

Я использовал fflush для, но все еще не работает.

пожалуйста, помогите мне исправить этот код и проверить, что случилось ....

ответ

0

Вы возвращаете указатель на локальный объект. Он создан в стеке. Вы не должны использовать его после того, как функция завершит свою работу, потому что она больше не существует, и ее память может содержать другие объекты.

Выделите кусок памяти на куче, используя malloc, инициализируйте его и используйте, пока не назовете free.

0

Ваш *m является указателем и равен NULL. Поэтому используйте malloc, чтобы иметь указатель на ваш struct_type_t, который вы можете освободить после.

void set_struct(struct_type_t **m) 
{ 
    *m = (struct_type_t *)malloc(sizeof(struct_type_t)); 
    (*m)->id = 5; 
    (*m)->name = strdup("Pointer To Structure"); 
    // or: (*m)->name = "Pointer To Structure"; 
} 
+0

но я инициализируюсь указатель '* M' структурировать' T' – harianja

+0

@harianja которая неопределенное поведение, потому что объект выходит из области видимости – CoffeeandCode

+0

@CoffeeandCode, если он выходит из области видимости, то почему он до сих пор печать элемент id структуры? – harianja

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