gpt4 book ai didi

c - 结构的字符串元素不保留分配的值

转载 作者:太空宇宙 更新时间:2023-11-04 02:54:32 24 4
gpt4 key购买 nike

我在使用 C 时遇到了一个奇怪的问题。

我有一个 .c 文件实现一个结构,另一个使用它。所讨论的结构是有关学生的基本信息(姓名和年级)。实现文件具有以下功能

  • 初始化
  • 读名字
  • 阅读成绩
  • 释放内存(删除实例)

主要文件如下:

int main (void){
char inBuff[30];
char* name = NULL;
int grade;
Student Stu;

printf("main: Please enter the name\n");
fgets(inBuff, 30, stdin);
name = malloc((sizeof(char)+1)*strlen(inBuff));
strncpy (name, inBuff, 20);

printf("main: Please enter the grade\n");
scanf("%d", &grade);

InitializeStudent (name, grade, &Stu);

/*value testing*/
printf("main: %s\n", Stu.name);
printf("main: %d\n", Stu.grade);

printf ("main: The student's name is %s\n", NameOfStudent(Stu));
printf ("main: The student's grade is %d\n", GradeOfStudent(Stu));

FreeStudent(&Stu);
free (name);
return 0;
}
InitializeStudent() 函数中的

printf() 语句似乎显示正确分配的值。但是,Stu.nameNameOfStudent(Stu) 都返回 ASCIIStu.Grade GradeOfStudent(Stu) 无论输入如何,都返回 2675716(这似乎是一个内存地址)。

值得注意的是,它已指定 NameOfStudent()GradeOfStudent() 是按值传递而不是使用指针(即副本应该创建结构并将其传递给函数)并且分别具有 char*int 返回类型,而 InitializeStudent() 被传递一个指针,是一个 void 函数。

也可能很重要,Student的name字段初始化为

char name[20];

而不是

char* name;

Student结构定义如下:

#define MAXNAMESIZE 20
typedef struct {
char name[MAXNAMESIZE];
int grade;
} Student;

根据要求,初始化student的代码如下

void InitializeStudent (char *name, int grade, Student *S) {
printf ("InitializeStudent: entered initialization\n");
int i = 0;
S = malloc (sizeof(Student));
for (i = 0; i< strlen(name); i++)
if (name[i] == '\n')
name[i] = '\0';
strncpy(S->name, name, 20);
S->grade = grade;

printf ("InitializeStudent: %s\n", S->name);
printf ("InitializeStudent: %d\n", S->grade);
}

最佳答案

问题在于,当您向InitializeStudent 函数传递一个指向已分配结构的指针时,您分配了Student 结构。

因为参数是按值传递(即复制)给函数的,指针 S 是一个副本,所以当你给它赋值时,你只赋值给函数中的本地副本。这就是为什么 main 函数中的结构没有被初始化,因为你只初始化了你在 InitializeStudent 函数中分配的结构,而不是你传入的结构。

最后,请注意 strncpy,因为如果源字符串比您传递给它的长度长,那么该函数将不会添加字符串终止符。


哦,顺便说一句,有一种更简单的方法可以从 fgets 中删除换行符:只需“删除”最后一个字符:

/* If `name` is not a `NULL` pointer, and the length is larger than zero
* and the last character is a newline...
*/
if (name != NULL && strlen(name) > 0 && name[strlen(name) - 1] == '\n')
name[strlen(name) - 1] = '\0';

关于c - 结构的字符串元素不保留分配的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19056417/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com