我最近開始在C中使用我的碩士論文,我很久沒有使用它了。習慣了Java,我現在總是面臨着各種各樣的問題。我希望有人能夠幫助我,因爲過去兩天我一直在努力。關於內存分配和賦值的基本C問題
所以我有一個非常基本的數據庫模型:表,元組,屬性,我試圖加載一些數據到這個結構中。以下是定義:
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(屬性))是否只分配存儲一個整數和兩個指針所需的內存(即不是這些指針指向的內存)?
任何幫助將不勝感激!
問候, Vassil
非常感謝你!關於不同的類型 - 我有分支,我只是沒有在這裏的例子中包含它。你可能是對的,我的C本科知識似乎不夠充分,我應該去圖書館看看你推薦的書。 – VHristov 2010-06-13 21:21:26