C 指针和队列的指针

标签 c pointers queue

我有接受指向指针的指针的方法

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 原型(prototype),则必须将其包装在 void * func(void *args) 以某种方式中,这我认为维护接收到的消息的状态太过分了。

此外,您需要确保正确释放所获取的资源。

关于C 指针和队列的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59981477/

相关文章:

C - 移动链表中的节点

c - 默认写入行为-O_TRUNC或O_APPEND?

c - 如何将两个变量的地址存储在后续C程序的指针中

java - 当另一端无法接收时处理队列中的项目

C作业: Print "The sum equals: " followed by the value of variable 'sum'

c - 是一个==*一个??关于指针的查询

c++ - 指针类型转换

python - 具有两个优先级值的优先级队列

c - 需要检查struct是否已经初始化

c - 如何按 '&' 将字符串拆分为标记