使用malloc将结构体数组传递给函数

3
我是一名有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我正在编写一个程序,在其中需要将学生添加到结构体数组中。

好的,一开始我有以下结构体数组:

struct student *students[4];

在声明后,我按照以下方式将学生添加到数组中(仅作为示例...):
  students[0] = malloc(sizeof(struct student));
  students[0]->firstname = "Max";
  students[0]->secondname = "Taler";
  students[0]->number = 123456l;

...

现在我需要编写一个额外的函数,其中我可以将数组作为参数传递并添加新学生。 因此,我的函数看起来像这样:
void add_student(struct student *students[],char *fristname, char *secondname, long number)
{
    int i=0;
    int new_position=0;
    int return_value = 0;
    // Search for the first available position for a new student 
    for(i=0; i<sizeof(students); i++)
    {
        if(students[i]==NULL)
        {
            new_position=i;
            return_value = 1;
            break;
        }
    }

    struct student *new_student = malloc(sizeof(struct student));
    students[new_position] = new_student;

    students[new_position]->fristname = fristname;
    students[new_position]->secondname = secondname;
    students[new_position]->number = number;

   return return_value; 
}

我用这段代码调用函数:
add_student(students, "Anni", "Karls", 123232);

但现在我的问题是:在我的“add_student”函数中,我得到一个具有奇怪结构的数组:它将自身作为第一个元素,并且每个其他元素都向后移动了1个元素。

无法弄清楚问题所在... 有人可以帮忙吗?

编辑:有人问我,这怎么可能。数组如何包含自己作为第一个元素。

好吧,这里是调试器(xCode)的截屏:

进入“add_student”之前:

before entering "add_student"

在输入“add_student”后,进入函数“add_student”:

after entering "add_student" -> IN the function "add_student"

正如您所见,“students”现在有5个元素...


2
i<sizeof(students)没有做你期望的事情。 - haccks
请注意,与您的说法相反,在您的代码中并没有呈现一个结构体数组。这将是一个元素为结构体的数组(这是允许的)。相反,您呈现了一个指向结构体的指针数组。 - John Bollinger
1
注意:void add_student(...) { ... return return_value; } 是一个问题。void函数不返回值。 - chux - Reinstate Monica
@chux 对不起,我知道这个,这只是由于“复制和粘贴”以及用英语翻译所引起的 :) - Maximus1809
2个回答

4
将数组的长度传递给函数,并更改这个。
for(i=0; i<sizeof(students); i++)

转换为:

for(i=0; i<arrayLen; i++)

看起来你正在将一个元素插入到事先分配好的数组中的某个位置; 插入可能比添加更合适,但这是个人意见。

你在函数内部对数组类型应用了 sizeof 运算符 - 这可能会给你指针的大小(以字节为单位),因为数组名会衰变为指针。


问题:sizeof(students)是否只是他/她计算机上指针的大小? - ForeverStudent
毫无疑问:这就是它的本质,因为在此范围内,“students”只不过是一个指针。 - mah
1
@mah:是的,在答案中已添加。 - Giorgi Moniava
@MaxLebold:你说的“数组将自身作为第一个元素”是什么意思?另外,你有没有考虑过如果数组中没有可用位置放置学生会发生什么? - Giorgi Moniava
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - John Bollinger
显示剩余5条评论

0

静态分配数组,但动态分配单个结构体有点奇怪。您可以考虑全部动态分配:

int num_students = 4;
struct student **students = malloc(sizeof(struct student) * num_students);

然后将您的add_student函数更改为以下内容:

void add_student(struct student *students[], int arr_size, char *firstname, char *secondname, long number)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接