【发布时间】:2014-04-29 20:44:02
【问题描述】:
我想构建一个结构,它可以保存简单的数据类型,如该结构的整数或数组。
结构如下:
typedef struct data_s {
size_t size; // size of memory data is pointing to
void * data; // pointer to data (array of data_t or simple type)
} data_t;
我已经简化了,通常结构中存储的信息更多。
我编写了设置和获取整数值的函数,它们可以工作!
现在我尝试编写用于创建数组以及设置和获取值的函数,但它们不起作用。
我用 gdb 找到它失败的地方。它向我表明我的取消引用没有按我的预期工作。我使用以下内容:
((data_t**)(data->data))[i]
我遇到了访问冲突。
如果有人能告诉我我的错误,那就太好了。这是一个工作代码示例,我已经最小化了代码,你没有我的程序的开销(也删除了错误处理)。
在带有 3.11 内核的 xubuntu 13.10 上使用带有 gcc 4.8.1 的 gcc -g main.c -o test 编译代码没有任何错误
#include <stdio.h>
#include <stdlib.h>
typedef struct data_s {
size_t size;
void * data;
} data_t;
void set_integer(data_t *data, int value){
data->size = sizeof(int);
data->data = malloc(data->size);
*((int*)(data->data)) = value;
}
void get_integer(data_t *data, int *value){
(*value) = *((int*)(data->data));
}
void create_array(data_t *data, size_t len){
data->size = sizeof(data_t) * len;
data->data = malloc(data->size);
int i;
for(i=0; i<data->size; i++){ //initialize array
((data_t**)(data->data))[i]->data = NULL;
((data_t**)(data->data))[i]->size = 0;
}
}
void set_array(data_t *data, int index, data_t *value){
((data_t**)(data->data))[index]->data = value->data;
((data_t**)(data->data))[index]->size = value->size;
}
void get_array(data_t *data, int index, data_t *value){
value->data = ((data_t**)(data->data))[index]->data;
value->size = ((data_t**)(data->data))[index]->size;
}
void free_data(data_t *data, int is_array){
if(is_array){
int i;
for(i=0; i<(data->size / sizeof(data_t)); i++)
free(((data_t**)(data->data))[i]->data);
}
free(data->data);
}
int main(int argc, char**argv){
data_t data;
set_integer(&data, 42);
int val;
get_integer(&data, &val);
printf("expect 42; has: %d\n", val);
free_data(&data, 0);
data_t element;
create_array(&data, 3);
int i;
for(i=0; i<3; i++){
set_integer(&element, i*2);
set_array(&data, i, &element);
}
for(i=0; i<3; i++){
get_array(&data, i, &element);
get_integer(&element, &val);
printf("index: %d; value: %d\n", i, val);
}
free_data(&data, 1);
return 0;
}
【问题讨论】:
-
您将结构成员和结构变量都命名为
data,从而增加了混乱。
标签: c arrays struct void-pointers