我不知道我在C中的下列结构出了什么问题。你能让我知道我做错了什么,最好的做法是什么。
#include<stdio.h>
#include<string.h>
typedef struct
{
char *name;
float gpa;
int courseNo;
} STUDENT;
void createStudent(STUDENT s, char *n, float gpa, int course);
int main(void)
{
struct STUDENT s;
createStudent(s, "Dummy", 3.8f, 203);
printf("Name = %s\n", s.name);
printf("GPA = %3.1f\n", s.gpa);
printf("Course No. = %d\n", s.courseNo);
return 0;
}
void createStudent(STUDENT s, char *n, float gpa, int course)
{
strcpy(s.name, n);
s.gpa = gpa;
s.courseNo = course;
}
答案 0 :(得分:4)
您是按值传递STUDENT
对象,而不是按引用传递,因此您在createStudent
函数中对其所做的任何更改都不会影响s
。改为传递指针。
通常,每当将变量传递给函数时,变量的值都会复制到相应的参数中。但是,此参数变量是与您传递的变量不同的变量。通过使用指针,您实际上是在告诉函数变量的身份,而不仅仅是它所拥有的值。
正如@simonc指出的那样,您的代码还有一个问题。当您在函数中调用strcpy
时,您正在写入的指针(s.name
)是单元化的,这意味着当您通过strcpy
分配其数据时,您将覆盖随机内存,这是只是问问题。在写入之前,您应该使用malloc
分配内存。
以下是完成的代码:
void createStudent(STUDENT *s, char *n, float gpa, int course)
{
s->name = malloc(strlen(n) + 1); // +1 for null terminator
strcpy(s->name, n);
s->gpa = gpa;
s->courseNo = course;
}
然后像这样称呼它:
createStudent (&s, other args ... )
请注意,完成后应该取消分配内存:
free(s.name);
但仅限于您不打算再使用该对象时。
答案 1 :(得分:1)
请改为尝试:
#include <stdio.h>
#include<string.h>
#include <stdlib.h>
typedef struct
{
char *name;
float gpa;
int courseNo;
} STUDENT;
void createStudent(STUDENT* s, char *n, float gpa, int course);
int main(void)
{
STUDENT s;
createStudent(&s, "Dummy", 3.8f, 203);
printf("Name = %s\n", s.name);
printf("GPA = %3.1f\n", s.gpa);
printf("Course No. = %d\n", s.courseNo);
return 0;
}
void createStudent(STUDENT* s, char *n, float gpa, int course)
{
s->name = malloc((strlen(n)+1) * sizeof(char));
strcpy(s->name, n);
s->gpa = gpa;
s->courseNo = course;
}