C中的简单结构 - 需要帮助

时间:2014-01-22 19:15:34

标签: c struct

我不知道我在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;
 }

2 个答案:

答案 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;
 }