我是编程和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中设置所有内容并复制数组,然后返回指向它的指针。我不知道它有时只能如何工作。希望你们能帮上忙,谢谢!
答案 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
中存储函数指针。