c - 指向指针和队列的 C 指针
问题描述
我有接受指向指针的指针的方法
typedef struct message_struct_t {
struct mystruct_t **obj; //not sure if this correct
char name[50];
};
int server(mystruct _t **obj) {
//i am able to push this to a queue
//but first i store this in my temp struct
message_struct_t *message = malloc(sizeof(message_struct_t));
message->obj = obj;
message->name = "Jaime";
myqueue_enqueue(message);
//some mutex and locking mechanism here
for(int i = 0; i < num_threads; i++)
pthread_create(&threads[i], NULL, send_message, NULL);
}
我需要获取此对象并将其传递给我将在线程池中处理的方法
int send_message() {
//i check and there is an item in my queue, but when i try to assign it to a new struct for
//handling i get errors
struct message_struct *received = malloc(sizeof(message_struct)); //ERROR HERE
printf("did I get here ? \n", received->name"); //ERROR
free(received);
}
我得到的错误是这个
==20730==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x61d0000102b0 at pc 0x55bab7c01cf5 bp 0x7f4d8a2fe980 sp 0x7f4d8a2fe0f8
READ of size 2089 at 0x61d0000102b0 thread T1
#0 0x55bab7c01cf4 in printf_common(void*, char const*, __va_list_tag*) (/project_main+0x5ccf4)
0x61d0000102b0 is located 0 bytes to the right of 2096-byte region [0x61d00000fa80,0x61d0000102b0)
allocated by thread T1 here:
#0 0x55bab7c6c7b0 in malloc
in printf_common(void*, char const*, __va_list_tag*)
Shadow bytes around the buggy address:
0x0c3a7fffa000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c3a7fffa010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c3a7fffa020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c3a7fffa030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c3a7fffa040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x0c3a7fffa050: 00 00 00 00 00 00[fa]fa fa fa fa fa fa fa fa fa
0x0c3a7fffa060: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c3a7fffa070: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c3a7fffa080: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c3a7fffa090: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c3a7fffa0a0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
Addressable: 00
Partially addressable: 01 02 03 04 05 06 07
Heap left redzone: fa
Freed heap region: fd
Stack left redzone: f1
Stack mid redzone: f2
Stack right redzone: f3
Stack after return: f5
Stack use after scope: f8
Global redzone: f9
Global init order: f6
Poisoned by user: f7
Container overflow: fc
Array cookie: ac
Intra object redzone: bb
ASan internal: fe
Left alloca redzone: ca
Right alloca redzone: cb
现在我是 C 的新手,我可能在某个地方犯了一些明显的错误,我会很感激一些关于我可能在哪里分配错误的建议(也许是指针?)。
解决方案
您send_message
应该如下所示:
void *send_message(void *args) {
struct message_struct *received = *((struct message_struct *) args);
// ....
free(received );
}
如果您无法更改send_message
原型,则必须将其包装在void * func(void *args)
不知何故的内部,我认为这对于维护接收到的消息的状态来说太过分了。
此外,您需要确保正确释放获取的资源。
推荐阅读
- c# - 如果找到位图
- python - 根据 json 文件中的列表 test-data 对测试进行参数化
- javascript - 如何使用 Angular 4 获取系统的 MAC 地址
- excel - 将数据复制到新工作表会引发“下标超出范围”
- c# - 球没有在桨/墙上正确弹跳
- java - 使用 Thymeleaf 为 Spring Boot 加载模板时出错
- python - 具有碰撞对的非碰撞对象,Pymunk Pygame
- system-verilog - 是否可以在分配语句之外在 SystemVerilog 中调用 new ?
- magento-1.9 - Magento 1 如何即时设置定期付款初始费用?
- webpack - 使用 webpack 在没有 js 导入的情况下观看和编译 sass