【问题标题】:C programming - why garbage data inside my struct?C 编程 - 为什么在我的结构中产生垃圾数据?
【发布时间】:2015-08-26 15:38:03
【问题描述】:

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

【问题讨论】:

标签: c pointers struct garbage


【解决方案1】:

你可以复制buf。

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

【讨论】:

    【解决方案2】:
    char buf[64]; 
    

    这里的buf 是函数addstud() 的局部变量,所以一旦你退出函数,这个数组就会超出范围,访问它会导致未定义的行为。

    【讨论】:

      【解决方案3】:
      sb->name.s = buf;
      

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

      你有两个选择,

      1)使用malloc()buf分配内存

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

      【讨论】:

      • 非常详细准确的回答,非常感谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多