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.
You have a few problems:
The
implicit declaration/reallocproblem is because you need to includestdlib.hfor thereallocsignature. 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
reallocan address that hasn’t been initialized. This is asking for trouble. Before using yourvectorvariable, do some initialization:Furthermore, your usage of
reallocis 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 thatrealloccan returnNULLupon failure, so do something like:Finally, don’t define your functions in the header. This will work, but it’s better to have an implementation file
vector_int.cthat defines the functions declared in the header.