2015-08-26 2 views
0

У меня есть следующие программы в C:C программирование - почему данные мусора внутри моей структуры?

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

typedef struct str{ 
    char * s; 
    int len; 
}string; 

typedef struct stud{ 
    unsigned int id; 
    string name; 
    char gender; 
}student; 

student* addstud(const int id, const char name[64], const char gender); 

student* addstud(void){ 
    char buf[64]; 
    struct stud *sb; 
    sb = (struct stud*)malloc(sizeof(struct stud)); 

    printf("Enter student ID:\n"); 
    scanf("%d",&sb->id); 

    printf("Enter student name:\n"); 
    scanf("%s", buf); 
    sb->name.s = buf; 
    sb->name.len = (int)strlen(buf); 

    printf("Enter student gender:\n"); 
    scanf(" %c", &sb->gender); 
    printf("Student ID: %d, name: %s, gender: %c\n", sb->id, sb->name.s, sb->gender); 

    return sb; 
} 

int main(){ 
    student *mystudent; 
    mystudent=addstud(); 
    printf("Student ID: %d, name: %s, gender: %c\n", mystudent->id, mystudent->name.s, mystudent->gender); 
    getchar(); 
    return 0; 
} 

В функции addstud(), Everthing это хорошо, но в main(), когда я пытаюсь напечатать имя студента из mystudent->name.s он просто мусор данных. Я не понимаю, почему это могло произошло, как это было явно хорошо в addstud() функции и оба указателя указывают на тот же адрес памяти :(Может кто-нибудь пожалуйста, лоскуток некоторый свет, что я сделал неправильно здесь, пожалуйста? Спасибо!

+3

'sb-> NAME.S = buf; 'buf находится в стеке, вам нужно опустить строку –

+0

[не набрасывать возвращаемое значение' malloc() '] (https://stackoverflow.com/questions/605845/do-cast- результат-of-malloc) –

ответ

2

вы можете дублировать БУФЫ.

sb->name.s = strdup(buf); 
+0

Спасибо, проголосовали! – osappuk

0
char buf[64]; 

Здесь buf локален функционировать addstud() так после выхода из функции этого массива из области видимости и доступ к нему приведет к непредсказуемому поведению.

-1
sb->name.s = buf; 

В этом buf является локальной переменной для функции addstud(). Таким образом, когда функция выходит, доступ к переменной - UB.

У вас есть 2 варианта,

1) Либо выделить память для buf с помощью malloc()

2) Используйте strcpy(), чтобы скопировать содержимое переменной buf в sb->name.s

+0

Очень подробный и точный ответ, большое спасибо! – osappuk

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