我想将变量 void* 分配给结构中的属性 void*。 我的结构 :
struct data{
int n;
void * cl;
}typedef data;
然后,我有这个功能:
void f(void *cl, int n){
struct data *data = malloc(sizeof(data));
data->cl = cl; //"Invalid write of size 8" from valgrind
data->n = n;
}
编辑:"void * cl"为空,我不知道为什么(但不是数据( 我这样称呼它:
f(args_f(2), 1);
关于args_f :
struct st_args * args_f(int n)
{
struct st_args *args = malloc(sizeof(struct st_args));
if (args == NULL)
return NULL;
args->n = n;
return args;
}
结构st_args:
struct st_args{
int n;
}typedef st_args;
在我的函数 f 中,当我尝试赋值"data->cl = cl;"时,valgrind 在此行上显示"大小为 8 的无效写入"。 这是为什么呢?
我在这里看到一个问题:struct st_args *args
是本地的,并且您已经return
了它,而没有分配适当的内存。
struct data *data = malloc(sizeof(data));
在此实例中,data
是一个指针,malloc
将分配 4(或 8(字节的内存。应该是,
struct data *data = malloc(sizeof(struct data));
这将分配(如果可用(所需的内存,段错误将消失。
此外,您应该检查data
是否在malloc
后NULL
,如果是,则按照您在函数中的方式处理错误args_f
。
这就是为什么我们应该避免变量命名约定的确切原因,其中用户定义的数据类型和变量名称可以相同。 就此而言,当我有一个typedef
时,我通常_t
后缀以避免任何混淆。
例如
这
struct data{
int n;
void * cl;
}typedef data;
在我的代码中会是这样的
typedef struct stData {
int32_t i_N;
void *p_cl;
} data_t;