C,使用 valgrind 和 void* 变量的无效写入
C, Invalid write with valgrind and void* variable
我想将变量 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 在这一行显示 "Invalid write of size 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;
我想将变量 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 在这一行显示 "Invalid write of size 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;