Я новичок в C, но несколько лет был программистом, поэтому я пытаюсь выучить C, следуя курсам Стэнфорда с 2008 года и выполняя Задание 3 по Векторам в C.
В основном это просто общий массив, поэтому данные хранятся внутри структуры как void *
.Флаг компилятора -Wpointer-arith
включен, поэтому я не могу сделать арифметику (и я понимаю причины этого).
Структура вокруг данных не должна знать какой тип данных, чтобы они были общими для вызывающей стороны.
Чтобы упростить задачу, я пробую следующий код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
void *data;
int aindex;
int elemSize;
} trial;
void init(trial *vector, int elemSize)
{
vector->aindex = 0;
vector->elemSize = elemSize;
vector->data = malloc(10 * elemSize);
}
void add(trial *vector, const void *elemAddr)
{
if (vector->aindex != 0)
vector->data = (char *)vector->data + vector->elemSize;
vector->aindex++;
memcpy(vector->data, elemAddr, sizeof(int));
}
int main()
{
trial vector;
init(&vector, sizeof(int));
for (int i = 0; i < 8; i++)
{add(&vector, &i);}
vector.data = (char *)vector.data - ( 5 * vector.elemSize);
printf("%d\n", *(int *)vector.data);
printf("%s\n", "done..");
free(vector.data);
return 0;
}
Однако я получаю ошибку бесплатно сfree(): invalid pointer
.Поэтому я запустил valgrind
на нем и получил следующее:
==21006== Address 0x51f0048 is 8 bytes inside a block of size 40 alloc'd
==21006== at 0x4C2CEDF: malloc (vg_replace_malloc.c:299)
==21006== by 0x1087AA: init (pointer_arithm.c:13)
==21006== by 0x108826: main (pointer_arithm.c:29)
На данный момент я предполагаю, что я либо неправильно выполняю char*
, либо, возможно, неправильно использую memcpy