(精通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)++;
}
答案 0 :(得分:2)
正如@ def1观察到的那样,你是按值传递指针。这不是addArray()
的问题 - 问题在于initArray()
。该函数的参数是函数的本地参数,因此当您为其指定malloc()
ed指针时,结果在main()
中不可见。最终,您最终会将NULL
指针传递给addArray()
。
至少有两种可能的解决方案。
在提供的代码中,我不清楚为什么struct arrayholder
需要动态分配。如果在main()
中您声明struct arrayholder myStruct;
并从malloc()
移除了initArray()
来电,那么其他所有内容都应按原样运作。
或者,如果您确实需要执行动态分配,那么您应该从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;
}
答案 1 :(得分:1)
void initArray(struct arrayHolder * b)
在这里,您将一个指向struct arrayHolder的指针传递给该函数。指针按值传递,这意味着它是一个副本。您可以更改指针指向的数据,但是当您将malloc的结果分配给b时,您正在修改指针本身的副本,这不会影响main中的指针。
可能的解决方案是使用指向指针的指针。
void initArray(struct arrayHolder ** b) {
*b = (struct arrayHolder *)malloc(sizeof(struct arrayHolder));
(*b)->count = 0;
}