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
我在 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