Я недавно начал работать над магистерской диссертацией по Си, которую я не использовал довольно долгое время.Привыкнув к Java, я все время сталкиваюсь со всевозможными проблемами.Я надеюсь, что кто-то может помочь мне с этим, так как я боролся с этим в течение последних двух дней.
Итак, у меня есть действительно базовая модель базы данных: таблицы, кортежи, атрибуты, и я пытаюсь загрузить некоторые данные в эту структуру.Ниже приведены определения:
typedef struct attribute
{
int type;
char * name;
void * value;
} attribute;
typedef struct tuple
{
int tuple_id;
int attribute_count;
attribute * attributes;
} tuple;
typedef struct table
{
char * name;
int row_count;
tuple * tuples;
} table;
Данные поступают из файла со вставками (созданного для теста Висконсина), который я анализирую.У меня есть только целочисленные или строковые значения.Пример строки будет выглядеть так:
insert into table values (9205, 541, 1, 1, 5, 5, 5, 5, 0, 1, 9205, 10, 11, 'HHHHHHH', 'HHHHHHH', 'HHHHHHH');
Мне «удалось» загрузить и проанализировать данные, а также назначить их.Однако бит присваивания содержит ошибки, поскольку все значения указывают на одну и ту же область памяти, то есть все строки выглядят одинаково после того, как я загрузил данные.Вот что я делаю:
char value[10]; // assuming no value is longer than 10 chars
int i, j, k;
table * data = (table*) malloc(sizeof(data));
data->name = "table";
data->row_count = number_of_lines;
data->tuples = (tuple*) malloc(number_of_lines*sizeof(tuple));
tuple* current_tuple;
for(i=0; i<number_of_lines; i++)
{
current_tuple = &data->tuples[i];
current_tuple->tuple_id = i;
current_tuple->attribute_count = 16; // static in our system
current_tuple->attributes = (attribute*) malloc(16*sizeof(attribute));
for(k = 0; k < 16; k++)
{
current_tuple->attributes[k].name = attribute_names[k];
// for int values:
current_tuple->attributes[k].type = DB_ATT_TYPE_INT;
// write data into value-field
int v = atoi(value);
current_tuple->attributes[k].value = &v;
// for string values:
current_tuple->attributes[k].type = DB_ATT_TYPE_STRING;
current_tuple->attributes[k].value = value;
}
// ...
}
Хотя я прекрасно понимаю, почему это не работает, я не могу понять, как заставить это работать.Я пробовал следующие вещи, ни один из которых не работал:
memcpy(current_tuple->attributes[k].value, &v, sizeof(int));
Это приводит к ошибке плохого доступа.То же самое для следующего кода (так как я не совсем уверен, какой из них будет правильным):
memcpy(current_tuple->attributes[k].value, &v, 1);
Даже не уверен, что мне нужен здесь memcpy ...
Также я попытался выделить память, выполнив что-то вроде:
current_tuple->attributes[k].value = (int *) malloc(sizeof(int));
только для получения "malloc: *** ошибка для объекта 0x100108e98: неверная контрольная сумма для освобожденного объекта - объект, вероятно, был изменен после освобождения."Насколько я понимаю, эта ошибка уже выделена для этого объекта, но я не вижу, где это произошло.Разве malloc (sizeof (attribute)) не выделяет только память, необходимую для хранения целого числа и двух указателей (т. Е. Не той памяти, на которую указывают указатели)?
Любая помощь будет принята с благодарностью!
С уважением, Василь