C中带有数组的结构的结果不一致

时间:2018-11-03 11:56:16

标签: c arrays struct

我是编程和C语言的新手,我刚刚学习了结构。我正在尝试使用它们来制作一个可以根据需要更改大小的数组(因此,如果数组已满,它将创建一个两倍大小的新数组,将旧数组复制到新数组中并删除旧数组)。到目前为止,我所做的只是创建结构和用于设置它的功能,而我已经遇到了问题。主要的问题是,有时在我运行它时,它确实达到了我的期望,即创建结构,返回指向该结构的指针,然后打印所包含数组的所有元素。其他时候我运行它时,它什么也不做!我不知道它有时如何工作,有时甚至不行!显然我做错了什么,但我无法解决。这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    int cap;
    int used;
    void (*cpy) (int *, const int *, int);
    //void (*append) (int);
    int array[];
} dynArray;

dynArray * new_dynArray(int *, int);
void copy(int *, const int *, int);

int main(void) {
    int start_arr[] = {1,2,3,4,5,6};
    // create new dynArray, pass start array and number of elemnts
    dynArray *arr = new_dynArray(start_arr, \
                sizeof(start_arr) / sizeof(start_arr[0]));
    // print all elements of dynArray
    for (int i=0; i<(arr->used); i++) {
        printf("%d, %d\n", arr->array[i], i);
    }
    free(arr);
    return 0;

}

dynArray * new_dynArray(int init_arr[], int size) {
    //printf("%d", size);
    // if number of elements >= 4 then dynArray size is double, else 8
    int init_cap = (size >= 4) ? 2 * size : 8;
    // create pointer with enough space for struct and the actual array
    dynArray *arr = (dynArray *) malloc(sizeof(dynArray) + init_cap );
    arr->cap = init_cap;
    arr->used = size;
    // assign address of funciton copy to arr->cpy
    arr->cpy = copy;
    // call the function, to copy init_arr to arr->array
    arr->cpy(arr->array, init_arr, size);
    return arr;
}

void copy(int dest[], const int src[], int src_size) {
    // just copy initial array to new array
    int i;
    memcpy(dest, src, src_size*sizeof(int));
    /*
    for (i=0; i<src_size; i++) {
        dest[i] = src[i];
        printf("%d\n", dest[i]);
    }*/
}

因此,我调用init_dynArray,发送一个普通数组和该数组中的元素数。 init_dynArray使用malloc在内存中为struct +数组的初始大小创建空间,在struct中设置所有内容并复制数组,然后返回指向它的指针。我不知道它有时只能如何工作。希望你们能帮上忙,谢谢!

1 个答案:

答案 0 :(得分:1)

您的代码中的问题在这一行:

dynArray *arr = (dynArray *) malloc(sizeof(dynArray) + init_cap );

您需要将init_cap乘以sizeof(int)

dynArray *arr = (dynArray *) malloc(sizeof(dynArray) + sizeof(int)*init_cap );

对于size_t的类型,您还应该使用init_cap

注意:如果动态数组由需要非平凡复制的不透明元素组成,则在struct内存储指向复制函数的指针将非常有用。由于复制int可以通过简单的memcpy完成,因此无需在dynArray中存储函数指针。