【发布时间】:2018-11-03 11:56:15
【问题描述】:
我是编程和 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 中的所有内容并复制数组,然后返回指向它的指针。我不明白它如何只能在某些时候起作用。希望各位大侠帮忙,谢谢!
【问题讨论】:
-
arr的分配中不应该有sizeof (int)吗?