противоречивые результаты для структуры с массивом в c - PullRequest
0 голосов
/ 03 ноября 2018

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

1 Ответ

0 голосов
/ 03 ноября 2018

Проблема в вашем коде находится в этой строке:

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 s может быть выполнено с помощью простого memcpy, нет необходимости хранить указатель на функцию в dynArray.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...