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

时间:2016-04-06 19:06:12

标签: 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)++;
}

2 个答案:

答案 0 :(得分:2)

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

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

  1. 在提供的代码中,我不清楚为什么struct arrayholder需要动态分配。如果在main()中您声明struct arrayholder myStruct;并从malloc()移除了initArray()来电,那么其他所有内容都应按原样运作。

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

  3. 这些替代方案中唯一应该完全棘手的是双指针变体,它看起来像这样:

    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;
}