我对C有点奇怪的问题。
我有一个实现结构的.c
文件,另一个使用它。有问题的结构是关于学生的基本信息(姓名和年级)。 Implementation文件具有函数
主文件如下:
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;
}
printf()
函数中的 InitializeStudent()
语句似乎显示正确分配的值。但是,Stu.name
和NameOfStudent(Stu)
都返回ASCII
,Stu.Grade
和GradeOfStudent(Stu)
返回2675716
(这似乎是一个内存地址),无论输入
值得注意的是,已经指定NameOfStudent()
和GradeOfStudent()
是值传递而不是使用指针(即应该制作结构的副本并传入函数)并分别有char*
和int
返回类型,而InitializeStudent()
传递一个指针并且是一个void函数。
同样重要的是,Student的名称字段初始化为
char name[20];
而不是
char* name;
Student
结构定义如下:
#define MAXNAMESIZE 20
typedef struct {
char name[MAXNAMESIZE];
int grade;
} 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);
}
答案 0 :(得分:2)
问题在于,当您向Student
函数传递指向已分配结构的指针时,会在InitializeStudent
函数中分配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';
删除换行符:只需“删除”最后一个字符:
{{1}}