2016-05-22 6 views
0

Я пытаюсь написать динамический массив в C, и я почти сделал это. Теперь я застрял в точке, где он дает ошибку при вставке в эту ошибку с использованием realloc () .Здесь мой код:Создание динамического массива в c дает ошибку при realloc()

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

    typedef struct { 

    int *array;//pointer that points to the start of the contiguous allocated blocks(an array of int) 

    size_t used;//array used 

    size_t size;//array total size 
    }D_Array; 


    void alloc_array(D_Array *a, int initial_size) 
    { 
    //allocate contiguous memory blocks and point a pointer to its beginning address... 
    a->array = (int*)malloc(initial_size*sizeof(int)); 
    a->used = 0; 
    a->size = initial_size; 
    } 


    void insert_array(D_Array *a, int element) 
    { 
    if(a->used == a->size) 
    { 
    //allocate one more space and then insert in array 
    a->array = (int*)relloc(a->array,(a->size)*sizeof(int)); 
    } 
    a->array[a->used++] = element; 
    } 


    void free_array(D_Array *a) 
    { 
    free(a->array); 
    a->array = NULL; 
    a->used = a->size = 0; 
    } 

    int main() 
    { 

    D_Array a; 
    int i=0, initial_size=0, insert_element=0; 

    printf("Enter the initial size of array :"); 
    scanf("%d",&initial_size); 
    alloc_array(&a, initial_size); 

    printf("\nEnter the elements to be inserted initially"); 
    for(i=0 ; i<initial_size ; ++i) 
    { 
    scanf("%d",&insert_element); 
    insert_array(&a, insert_element); 
    } 
    a.array[0] = 3; 
    for(i=0 ; i<initial_size ; ++i) 
    { 
    printf("%d",*((a.array)+i)); 
    } 
    } 

Проблема в методе «insert_array», но я не знаю, why.Everything кажется, хорошо для меня.

[обновление от comment:]

Компилятор дает:

quicksort.c:32:14: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] a->array = (int*)relloc(a->array,(a->size)*sizeof(int));^/tmp/ccXTwlHh.o: In function insert_array': quicksort.c:(.text+0x8d): undefined reference to relloc' collect2: error: ld returned 1 exit status 
+0

quicksort.c: 32: 14: warning: cast to pointer from integer разного размера [-Wint-to-pointer-cast] a-> array = (int *) relloc (a-> array, (a -> размер) * SizeOf (INT)); ^ /tmp/ccXTwlHh.o: В функции 'insert_array ': quicksort.c :(текст + 0x8d.): Неопределенная ссылка на' relloc' collect2: ошибка: л.д. возвращается 1 выходной статус – Reckoner

+0

не ' -> array [a-> used ++] = element; 'вызывать из ограниченного доступа, поскольку' a-> used == a-> size'? –

+0

@bkVnet Нет, он не должен .... Предположим, что он равен 3, а «используется» равен 0. Теперь он будет вставляться в индекс «0» и приращение «используется», после чего он будет вставляться в «1» и приращение »используется '... снова он будет вставляться в' 2 'и increment' used '.... Теперь' used is '3' и 'size' равен 3.So он войдет в 'if' и перераспределит еще один блок, а затем вставьте снова. – Reckoner

ответ

2

Добавление к сказанному вы писали: relloc вместо realloc. Таким образом, возможно, существует опечатка, которая препятствует компиляции.

+0

Такая глупая ошибка с моей стороны ..... ее сделано ... Спасибо большое ... заслуживают некоторых голосов. – Reckoner

4

Есть две проблемы с вашим realloc вызова: Первое, что произойдет, если realloc терпит неудачу и возвращает NULL. Вот почему вы никогда не должны переназначать переменную, которую вы передаете на вызов realloc.

Вторая проблема, и что, вероятно, вызывает проблему, является то, что, что вы делаете на самом деле не размер массива, вместо этого вы перераспределить его с использованием точно такой же размер, как и раньше, а это означает, что, когда вы в следующий раз сделать

a->array[a->used++] = element; 

Вы индексируете за рамки и будете иметь undefined поведение.

+0

Так как я должен использовать realloc() в этом случае? Предположим, у меня есть 5 блоков памяти, которые я создал с помощью malloc(). Указатель «array» указывает на адрес первого блока. Теперь, когда я использую realloc(), как я использовал здесь, не предполагается, что он создает новый заразительный блок памяти? – Reckoner

+0

@ Reckoner, но вы не увеличиваете размер блока памяти, а просто перераспределяете его с тем же размером. Перед вызовом вам нужно увеличить значение 'a-> size'. Это, конечно, после исправления 'relloc' typo :) –

+0

@Reckoner Вы уже выделили элементы' a-> size', используя 'malloc', тогда вызов' realloc' перераспределяет число элементов 'a-> size'. Вы должны увеличить 'a-> size' перед перераспределением. –