在函数中使用一个struct数组上的calloc

时间:2015-10-24 11:08:44

标签: c arrays function struct calloc

这是我的结构

//global
typedef struct {
    char idCode[MATLENGTH + 10];
    char *name;
} stud;

主要是,我这样做

Int main() {

    stud *students;
    createStudentArray(students);
    ....

我想做的是:

- 将数组(* student)传递给函数

- 制作函数alloc。数组

这是我写的功能

createStudentArray(stud *students) {

    //I get this value from a file
    int nstud = 3;
    students calloc(nstud, sizeof(students));
    return;
}
问题是:

- 当我尝试将任何值分配给学生字段时,它不起作用

离。

Int main() {

    stud *students;
    createStudentArray(students);
    ....
    strcpy(students[0].name, "Nicola"); //this is where i get the error

我的猜测是,在某种程度上,我没有正确分配数组,因为,当我尝试做的时候

strcpy(students[0].name, "Nicola");

在createStudentArray函数中,它很好。所以看起来我按值​​传递数组,而不是通过引用。

提前感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

这是因为students指针是按值传递的。 createStudentArray内对stud *createStudentArray() { //I get this value from a file int nstud = 3; stud *students = calloc(nstud, sizeof(students)); ... return students; } ... stud *students = createStudentArray(); 的任何分配对调用者都是不可见的。

您有两种方法可以解决此问题:

  • 返回新分配的指针并将其分配给调用者,或
  • 接受指向指针的指针,并使用间接运算符进行分配。

这是第一个解决方案:

void createStudentArray(stud ** pstudents) {
    //I get this value from a file
    int nstud = 3;
    *pstudents = calloc(nstud, sizeof(students));
    ...
}
...
stud *students;
createStudentArray(&students); // Don't forget &

这是第二个解决方案:

x

答案 1 :(得分:2)

在C中,参数由值传递,而不是通过引用传递。

对被调用函数中的参数所做的更改不会影响调用函数中的变量。

要从被调用者函数修改调用者的变量,请使用指针。

createStudentArray(stud **students) {

    //I get this value from a file
    int nstud = 3;
    *students = calloc(nstud, sizeof(stud)); // this should be sizeof(stud), not students
    return;
}

int main() {

    stud *students;
    createStudentArray(&students);
    ....

答案 2 :(得分:0)

这是因为在你的函数中,只有本地指针会被分配给你分配的内存块的新地址。 要从外部获取它,您需要使用指向指针的指针,如下所示:

createStudentArray(stud **students) { ... }

并将其称为:

createStudentArray(&students);

答案 3 :(得分:0)

你是对的,学生作为值传递给CreateStudentsArray(),你要么改变它以接受** stud,要么让它返回指向所创建数组的指针。

我的建议是使用指向指针的指针并使用*运算符取消引用它。

createStudentArray(stud **students) {

    //I get this value from a file
    int nstud = 3;
    *students = calloc(nstud, sizeof(students));
    return;
}

    void main(){
    stud = *students;
    ...
    createStudentsArray(&students);
    ...
    strcpy....