Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error when using memory allocation (realloc) with pointer of structure, which has a dynamic array

vector_int.h is a header with self-made dynamic array (vector) structure.

test.c is a testing programm.

All code is bellow:

vector_int.h:

#include <stdio.h>

typedef struct 
{
    long int len; // Length
    int *array;   // Dynamic Array
} IntVector; 

void ResizeIntVector(IntVector *vector, int size) // Resizing of vector
{
    realloc(vector->array, size * sizeof(int));
    vector->len = size; // Changing of length variable
}

void SetIntVectorCell(IntVector *vector, unsigned int cell_number, int cell_value) // Put cell_value in array[cell_number]
{
    if (cell_number >= vector->len)
        ResizeVectorInt(&vector, cell_number); // Grow size of memory if it's not enough

    vector->array[cell_number] = cell_value;
}

test.c:

#include "vector_int.h"
#include <stdio.h>

int main()
{
    IntVector vector;

    int n;
    scanf("%d", &n);

    int i;
    for (i = 0; i < n; i++) // testing
    {
        SetIntVectorCell(&vector, i, i);
        printf("%d ", vector.array[i]);
    }

    return 0;       
}

Logs:

1   0   D:\Work\Raspberry Pi\test.c In file included from D:\Work\Raspberry Pi\test.c
        D:\Work\Raspberry Pi\vector_int.h   In function 'ResizeIntVector':
11  2   D:\Work\Raspberry Pi\vector_int.h   [Warning] incompatible implicit declaration of built-in function 'realloc' [enabled by default]
            [Linker error] C:\Users\ALEXAN~1\AppData\Local\Temp\cccFKqxs.o:test.c:(.text+0x4a): undefined reference to `ResizeVectorInt'
            collect2: ld returned 1 exit status

I think that there is error in using realloc function, but I thought that I did all right. Please help me and find a mistake or mistakes.

like image 929
Александр Рак Avatar asked Mar 05 '26 06:03

Александр Рак


1 Answers

You have a few problems:

  • The implicit declaration/realloc problem is because you need to include stdlib.h for the realloc signature. Without a function signature the compiler will make some assumptions about your function arguments and return value, then during linking, the linker complains about this if these assumptions don't match the actual function implementation.

  • You're passing realloc an address that hasn't been initialized. This is asking for trouble. Before using your vector variable, do some initialization:

    vector->array = NULL;
    vector->len = 0;
    
  • Furthermore, your usage of realloc is incorrect: it won't change the actual pointer that you give it, only the size of the memory block pointed to. You need to re-assign the pointer yourself. Note that realloc can return NULL upon failure, so do something like:

    tmp = realloc(vector->array, size * sizeof(int));
    
    if (tmp != NULL)
    {
        vector->array = tmp;
        vector->len = size; // Changing of length variable
    }
    else handleAllocError();
    
  • Finally, don't define your functions in the header. This will work, but it's better to have an implementation file vector_int.c that defines the functions declared in the header.

like image 51
pb2q Avatar answered Mar 06 '26 19:03

pb2q