c - 将数组元素添加到结构中的数组

标签 c arrays struct

(精通 C++,C 新手)从 main() 中的 addArray() 调用中获取段错误。我检查了很多帖子和几篇文章,它编译了,但没有运气运行它。我在 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)++;
}

最佳答案

正如@def1 所观察到的,您正在按值传递指针。这不是 addArray() 的问题——问题出在 initArray() 上。该函数的参数是函数的局部参数,因此当您将 malloc() 指针分配给它时,结果在 main() 中不可见。最终,您最终将 NULL 指针传递给 addArray()

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

  1. 在提供的代码中,我根本不清楚为什么 struct arrayholder 需要动态分配。如果在 main() 中声明为 struct arrayholder myStruct; 并从 initArray() 中删除 malloc() 调用>,那么其他一切都应该按原样工作。

  2. 或者,如果您确实需要执行动态分配,那么您应该从 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;
}

关于c - 将数组元素添加到结构中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36460215/

相关文章:

c - 重新创建 strstr() 函数

c - 从 C++ 程序中使用 C 函数 - extern 关键字问题

javascript - 使用 Angular - 不显示基于其他数组项目的 Ng-Repeat 数组项目

即使释放指向结构的指针后也会发生 C 内存泄漏

c - UDP 接收超时选项 linux c

c - 无效指针条件引发段错误

c - 为什么我的数组中有我没有分配的值?

c# - 如何展平数组数组?

c++ - C 与 C++ 中的 Typedef 结构

json - 如何遍历结构?