Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将结构数组传递给具有malloc的函数_C_Arrays_Struct - Fatal编程技术网

将结构数组传递给具有malloc的函数

将结构数组传递给具有malloc的函数,c,arrays,struct,C,Arrays,Struct,我正在编写一个程序,需要将学生添加到结构数组中 首先,我有以下结构数组: struct student *students[4]; 在声明之后,我将这样的学生添加到数组中(只是为了有示例…): 现在我必须编写一个附加函数,在这里我可以将数组作为参数传递,并添加一个新的student 我的函数如下所示: void add_student(struct student *students[],char *fristname, char *secondname, long number) {

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

首先,我有以下结构数组:

struct student *students[4];
在声明之后,我将这样的学生添加到数组中(只是为了有示例…):

现在我必须编写一个附加函数,在这里我可以将数组作为参数传递,并添加一个新的student

我的函数如下所示:

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; 
}
void add_student(struct student *students[], int arr_size, char *firstname, char *secondname, long number)
但是现在我的问题:在我的“add_student”函数中,我得到一个数组,它有一个奇怪的结构:它将自身作为第一个元素,其他元素每移动一个元素

我想不出是什么问题。。。有人能帮忙吗

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

下面是调试器(xCode)的屏幕截图:

在输入“添加学生”之前:

在“添加学生”功能中输入“添加学生”->后:


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

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

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

<代码> >(i=0;i)静态分配数组有点奇怪,但动态地分配各个结构。您可以考虑动态分配它们:

int num_students = 4;
struct student **students = malloc(sizeof(struct student) * num_students);
然后将
add_student
函数更改为如下所示:

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; 
}
void add_student(struct student *students[], int arr_size, char *firstname, char *secondname, long number)

i请注意,与您的声明相反,您在代码中不提供结构数组。这将是一个元素为结构的数组(这是允许的)。相反,您提供一个指针数组(指向结构)。注意:
void add_student(…){…return_value;}
是一个问题。
void
函数不返回值。@chux是的,对不起,我知道这只是由“复制粘贴”和英语翻译引起的:)问题:sizeof(学生)只是他/她的机器上指针的大小吗,因为
students
在这个范围内只不过是一个指针。@mah:yes,在答案中添加了。我已经添加了数组长度作为参数。但我仍然有一个问题,即传递的数组以某种方式将自身包含为第一个元素。@MaxLebold:你说的“数组将自身包含为第一个元素”是什么意思?你是否考虑过如果学生在数组中没有可用的位置会发生什么?
void add_student(struct student *students[], int arr_size, char *firstname, char *secondname, long number)