C 编程 - 为什么我的结构中有垃圾数据?

C programming - why garbage data inside my struct?

我在 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() 函数中,一切都很好,但在 main() 中,当我尝试从 mystudent->name.s 中打印出学生姓名时,它只是垃圾数据。我不明白为什么会发生这种情况,因为它在 addstud() 函数中显然没问题,并且两个指针都指向相同的内存地址 :( 谁能解释一下我在这里做错了什么?谢谢!

char buf[64]; 

此处 buf 是函数 addstud() 的局部变量,因此一旦退出该函数,此数组就超出范围,访问它会导致未定义的行为。

你可以复制缓冲区。

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

其中,buf是函数addstud()的局部变量。所以,当函数退出时,访问变量是UB。

您有 2 个选择,

1) 使用 malloc()

buf 分配内存

2) 使用strcpy()将变量buf的内容复制到sb->name.s