Я новичок в программировании и 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, чтобы создать пространство в памяти для структуры + размер массива inintal, настроить все в структуре и скопировать массив, а затем вернуть указатель на него. Я не понимаю, как это может работать только время от времени. Надеюсь, ребята, вы можете помочь, спасибо!