C,使用 valgrind 和 void* 变量进行无效写入



我想将变量 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是否在mallocNULL,如果是,则按照您在函数中的方式处理错误args_f

这就是为什么我们应该避免变量命名约定的确切原因,其中用户定义的数据类型和变量名称可以相同。 就此而言,当我有一个typedef时,我通常_t后缀以避免任何混淆。

例如

struct data{
int n;
void * cl;
}typedef data;

在我的代码中会是这样的

typedef struct stData {
int32_t i_N;
void *p_cl;
} data_t;

最新更新