【问题标题】:Pass struct array to function with malloc将结构数组传递给 malloc 函数
【发布时间】:2015-12-18 19:52:34
【问题描述】:

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

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

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”函数中,我得到了一个具有奇怪结构的数组:它包含自己作为第一个元素,并且每个其他元素都移动了一个元素。

无法弄清楚问题是什么......有人可以帮忙吗?

编辑:有人问我,这怎么可能。数组如何将“自身”作为第一个元素。

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

在输入“add_student”之前:

输入“add_student”后 -> 在函数“add_student”中:

如您所见,“学生”现在有 5 个元素...

【问题讨论】:

  • i&lt;sizeof(students) 没有达到您的预期。
  • 请注意,与您的声明相反,您确实在代码中呈现结构数组。那将是一个数组,其元素是结构(这是允许的)。相反,您提供了一个指针数组(指向结构)。
  • 注意:void add_student(...) { ... return return_value; } 是个问题。 void 函数不返回值。
  • @chux 是的,对不起,我知道这只是由“复制和粘贴”和翻译成英文引起的 :)

标签: c arrays struct


【解决方案1】:

将数组的长度传递给函数并更改它

for(i=0; i<sizeof(students); i++)

到这里

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

您似乎正在将一个元素插入到预先分配的数组中的某个位置;插入可能比添加更合适,但这是意见。

您在函数内部的数组类型上应用 sizeof 运算符 - 这可能会给您以字节为单位的指针大小,因为数组名称会衰减为指针。

【讨论】:

  • 问题:sizeof(students) 只是他/她机器上指针的大小
  • 没什么好猜的:就是这样,因为students 在这个范围内只不过是一个指针。
  • @mah:是的,添加在答案中。
  • 我已将数组长度添加为参数。但我仍然有问题,传递的数组以某种方式将自身包含为第一个元素。
  • @MaxLebold:你是什么意思“数组包含自己作为第一个元素”?您是否还考虑过如果数组中没有学生可用的位置会发生什么?
【解决方案2】:

静态分配数组然后动态分配单个结构有点奇怪。您可以考虑将它们全部动态分配:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2021-11-02
    相关资源
    最近更新 更多