'Invalid read of Size 8' - Valgrind。尝试用来自其他结构的数据填充结构
'Invalid read of Size 8' - Valgrind. Trying to populate struct with data from other struct
当 运行 Valgrind 检查时,我得到一个 'Invalid read of size 8' 指向使用 memcpy。目标字段是一个空的、未初始化的结构。源是同一个结构,它是另一个结构的成员。
即目标 = 酒吧,来源 = Foo->酒吧。
我假设问题在于 memcpy 中的大小 arg。我尝试过使用 sizeof(Foo->Bar)、sizeof(Bar) 和 sizeof(Bar_s)。
在header中:
struct Foo_s
{
Bar_t payload;
//other structs and variables
};
typedef struct
{
uint64_t timestamp;
uint16_t id;
} Bar_t;
在 c 文件中:
//Foo_s is passed into the function already populated, let's call it foo_data
Bar_t payload_data;
memcpy(&payload_data, &(foo_data->payload_data), sizeof(foo_data->payload_data));
我得到了预期的行为,但是 Valgrind 似乎不喜欢它的完成方式。
这是错误:
Thread 36 function_name:47/101:
==774== Invalid read of size 8
==774== at 0x1C1E59: function_name (in /path/to/exe)
==774== by 0x189065: another_function (in /path/to/exe)
==774== by 0x5D544A3: another_function2 (pthread_create.c:456)
==774== Address 0x40bb6b8 is on thread 11's stack
==774== 1896 bytes below stack pointer
valgrind 消息表明:
- 在线程 11 中,您将
Foo_s
创建为局部变量,即在堆栈上
- 您启动了一个新线程,线程 36,传递了一个指向该变量的指针
- 线程 36 尝试从该指针读取数据
- 但是线程 11 已经 "left" 您创建变量的函数,因此线程 36 尝试读取的数据已经无效
当 运行 程序时你仍然得到有效结果,因为还没有任何东西覆盖该数据。
当 运行 Valgrind 检查时,我得到一个 'Invalid read of size 8' 指向使用 memcpy。目标字段是一个空的、未初始化的结构。源是同一个结构,它是另一个结构的成员。
即目标 = 酒吧,来源 = Foo->酒吧。
我假设问题在于 memcpy 中的大小 arg。我尝试过使用 sizeof(Foo->Bar)、sizeof(Bar) 和 sizeof(Bar_s)。
在header中:
struct Foo_s
{
Bar_t payload;
//other structs and variables
};
typedef struct
{
uint64_t timestamp;
uint16_t id;
} Bar_t;
在 c 文件中:
//Foo_s is passed into the function already populated, let's call it foo_data
Bar_t payload_data;
memcpy(&payload_data, &(foo_data->payload_data), sizeof(foo_data->payload_data));
我得到了预期的行为,但是 Valgrind 似乎不喜欢它的完成方式。
这是错误:
Thread 36 function_name:47/101:
==774== Invalid read of size 8
==774== at 0x1C1E59: function_name (in /path/to/exe)
==774== by 0x189065: another_function (in /path/to/exe)
==774== by 0x5D544A3: another_function2 (pthread_create.c:456)
==774== Address 0x40bb6b8 is on thread 11's stack
==774== 1896 bytes below stack pointer
valgrind 消息表明:
- 在线程 11 中,您将
Foo_s
创建为局部变量,即在堆栈上 - 您启动了一个新线程,线程 36,传递了一个指向该变量的指针
- 线程 36 尝试从该指针读取数据
- 但是线程 11 已经 "left" 您创建变量的函数,因此线程 36 尝试读取的数据已经无效
当 运行 程序时你仍然得到有效结果,因为还没有任何东西覆盖该数据。