(精通 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()
。
至少有两种可能的解决方案。
在提供的代码中,我根本不清楚为什么
struct arrayholder
需要动态分配。如果在main()
中声明为struct arrayholder myStruct;
并从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;
}
关于c - 将数组元素添加到结构中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36460215/