向结构中的数组添加数组元素 (精通C++,NeXiBe:C)从主()中的AdAdRayAube()调用中得到一个Sebug错误。我检查了很多帖子和几篇文章,它们都是编译的,但运行起来却不走运。我在VS2015上编写代码,所有常用的方便提示都有指针等。很明显我没有意识到或语法错误。这是复制错误的提取代码 #include<stdio.h> #include <stdlib.h> #define TYPE int struct arrayHolder { TYPE data[100]; int count; }; //prototypes. void initArray(struct arrayHolder * ); void addArray(struct arrayHolder *, TYPE); int main() { struct arrayHolder * myStruct = NULL; initArray(myStruct); addArray(myStruct, 123); } /* Allocate memory for struct arrayHolder */ void initArray(struct arrayHolder * b) { b = (struct arrayHolder *)malloc(sizeof(struct arrayHolder)); b->count = 0; } /* Add an element to data[] */ void addArray(struct arrayHolder * b, TYPE v) { int count = b->count; b->data[count] = v; (b->count)++; } #包括 #包括 #定义类型int 结构阵列文件夹{ 类型数据[100]; 整数计数; }; //原型。 void initArray(struct arrayHolder*); void addArray(struct arrayHolder*,类型); int main(){ struct arrayHolder*myStruct=NULL; initArray(myStruct); addArray(myStruct,123); } /*为结构arrayHolder分配内存*/ void initArray(结构arrayHolder*b){ b=(结构arrayHolder*)malloc(sizeof(结构arrayHolder)); b->count=0; } /*将元素添加到数据[]*/ void addArray(结构arrayHolder*b,类型v){ int count=b->count; b->数据[计数]=v; (b->计数)+; }

向结构中的数组添加数组元素 (精通C++,NeXiBe:C)从主()中的AdAdRayAube()调用中得到一个Sebug错误。我检查了很多帖子和几篇文章,它们都是编译的,但运行起来却不走运。我在VS2015上编写代码,所有常用的方便提示都有指针等。很明显我没有意识到或语法错误。这是复制错误的提取代码 #include<stdio.h> #include <stdlib.h> #define TYPE int struct arrayHolder { TYPE data[100]; int count; }; //prototypes. void initArray(struct arrayHolder * ); void addArray(struct arrayHolder *, TYPE); int main() { struct arrayHolder * myStruct = NULL; initArray(myStruct); addArray(myStruct, 123); } /* Allocate memory for struct arrayHolder */ void initArray(struct arrayHolder * b) { b = (struct arrayHolder *)malloc(sizeof(struct arrayHolder)); b->count = 0; } /* Add an element to data[] */ void addArray(struct arrayHolder * b, TYPE v) { int count = b->count; b->data[count] = v; (b->count)++; } #包括 #包括 #定义类型int 结构阵列文件夹{ 类型数据[100]; 整数计数; }; //原型。 void initArray(struct arrayHolder*); void addArray(struct arrayHolder*,类型); int main(){ struct arrayHolder*myStruct=NULL; initArray(myStruct); addArray(myStruct,123); } /*为结构arrayHolder分配内存*/ void initArray(结构arrayHolder*b){ b=(结构arrayHolder*)malloc(sizeof(结构arrayHolder)); b->count=0; } /*将元素添加到数据[]*/ void addArray(结构arrayHolder*b,类型v){ int count=b->count; b->数据[计数]=v; (b->计数)+; },c,arrays,struct,C,Arrays,Struct,在这里,将指向结构arrayHolder的指针传递给函数。指针通过值传递,这意味着它是一个副本。您可以更改指针指向的数据,但当您将malloc的结果指定给b时,您正在修改指针本身的副本,这不会影响main中的指针 可能的解决方案是使用指向指针的指针 void initArray(struct arrayHolder ** b) { *b = (struct arrayHolder *)malloc(sizeof(struct arrayHolder)); (*b)->cou

在这里,将指向结构arrayHolder的指针传递给函数。指针通过值传递,这意味着它是一个副本。您可以更改指针指向的数据,但当您将malloc的结果指定给b时,您正在修改指针本身的副本,这不会影响main中的指针

可能的解决方案是使用指向指针的指针

void initArray(struct arrayHolder ** b) {
    *b = (struct arrayHolder *)malloc(sizeof(struct arrayHolder));
    (*b)->count = 0;
}
在这里,将指向结构arrayHolder的指针传递给函数。指针通过值传递,这意味着它是一个副本。您可以更改指针指向的数据,但当您将malloc的结果指定给b时,您正在修改指针本身的副本,这不会影响main中的指针

可能的解决方案是使用指向指针的指针

void initArray(struct arrayHolder ** b) {
    *b = (struct arrayHolder *)malloc(sizeof(struct arrayHolder));
    (*b)->count = 0;
}

正如@def1所观察到的,您正在按值传递指针。这不是
addArray()
的问题——问题在于
initArray()
。该函数的参数是函数的本地参数,因此当您将
malloc()
ed指针指定给它时,结果在
main()
中不可见。最终,您将传递一个指向
addArray()
NULL
指针

至少有两种可能的解决方案

  • 在给出的代码中,我不清楚为什么需要动态分配
    struct arrayholder
    。如果在
    main()
    并从
    initArray()
    中删除
    malloc()
    调用,然后其他一切都应按原样工作

  • 或者,如果您确实需要执行动态分配,那么您应该从
    initArray()
    (在这种情况下,该函数不需要参数)返回一个指向已分配内存的指针,或者您需要向该函数传递一个双指针,以便
    main()
    的指针可以由此更新

  • 在这些备选方案中,唯一一个应该非常棘手的是双指针变量,它看起来如下所示:

    int main() {
        struct arrayHolder * myStruct = NULL;
        initArray(&myStruct);                 /* difference here */
        addArray(myStruct, 123);
    }
    
    /* Allocate memory for struct arrayHolder */
    void initArray(struct arrayHolder ** b) {
        /* no cast is required here in C, and many account one poor style: */:
        *b = malloc(sizeof(struct arrayHolder));
        (*b)->count = 0;
    }
    

    正如@def1所观察到的,您正在按值传递指针。这不是
    addArray()
    的问题——问题在于
    initArray()
    。该函数的参数是函数的本地参数,因此当您将
    malloc()
    ed指针指定给它时,结果在
    main()
    中不可见。最终,您将传递一个指向
    addArray()
    NULL
    指针

    至少有两种可能的解决方案

  • 在给出的代码中,我不清楚为什么需要动态分配
    struct arrayholder
    。如果在
    main()
    并从
    initArray()
    中删除
    malloc()
    调用,然后其他一切都应按原样工作

  • 或者,如果您确实需要执行动态分配,那么您应该从
    initArray()
    (在这种情况下,该函数不需要参数)返回一个指向已分配内存的指针,或者您需要向该函数传递一个双指针,以便
    main()
    的指针可以由此更新

  • 在这些备选方案中,唯一一个应该非常棘手的是双指针变量,它看起来如下所示:

    int main() {
        struct arrayHolder * myStruct = NULL;
        initArray(&myStruct);                 /* difference here */
        addArray(myStruct, 123);
    }
    
    /* Allocate memory for struct arrayHolder */
    void initArray(struct arrayHolder ** b) {
        /* no cast is required here in C, and many account one poor style: */:
        *b = malloc(sizeof(struct arrayHolder));
        (*b)->count = 0;
    }
    

    参数是按值传递的。initArray()中的赋值在函数外部无效。@def1:但我不是在传递指针吗?@Chris:是的,您可以更改指针指向的数据,但您给指针本身赋值,该赋值不会在函数外部进行,使用指向指针的指针。标准说明:不要将
    void*
    强制转换为C中的其他指针。语法错误不会导致segfault,因为它不会编译。而且,C++中的代码也是错误的。参数是按值传递的。initArray()中的赋值在函数外部无效。@def1:但我不是在传递指针吗?@Chris:是的,您可以更改指针指向的数据,但您给指针本身赋值,该赋值不会在函数外部进行,使用指向指针的指针。标准说明:不要将
    void*
    强制转换为C中的其他指针。语法错误不会导致segfault,因为它不会编译。你的代码也会在C++中出错。克里斯,我很乐意帮忙。然而,正如奥拉夫所观察到的,C++中的代码也不正确。除了关于删除
    malloc()。C++需要Case.@克里斯:它与C++中传递指针没有区别。您可以选择使用对指针的引用,但这是另一种类型,并且具有独特的语法。@Chris,我很乐意提供帮助。然而,正如奥拉夫所观察到的,C++中的代码也不正确。我所有的评论都适用于这里,除了关于rem的