2014-01-18 24 views
-2

我讀了很多malloc.c:3096:smsMALLOc: topiccs,但我找不到任何解決方案,我的問題。我的頭放棄了用這種能力工作,我問你。這裏是:另一個malloc.c:3096:與pthreads和mqueue sYSMALLOc問題

我有sensors.hsensors.cmain.c文件。我想在消息隊列中的不同文件(sensors.c和main.c)中的兩個函數(線程)之間交換消息。 gcc編譯器編譯它wihtout任何錯誤像往常一樣,但試圖運行它的時候,我收到斷言錯誤malloc.c:3096: sYSMALLOc: Assertion (old_top == (((mbinptr) (((char *) &((av)->bins.....

file:sensor.h 

typedef struct vector { 
     double x; 
     double y; 
     double z; 
} vector_t; 

typedef struct all_vectors { 
     vector_t *gyro; 
     vector_t *accel; 
     vector_t *magnet; 
} vectors_t; 



file:main.c: 

#include "sensors.h" 

vectors_t *vectors; // global 
pthread_t threads[3]; 
int rc; 

int main() 
{ 
    .... 
    vectors  = (vectors_t *)malloc(sizeof(vectors_t *)); 
    vectors->gyro = (vector_t *)malloc(sizeof(vector_t *)); 
    vectors->accel = (vector_t *)malloc(sizeof(vector_t *)); 
    vectors->magnet = (vector_t *)malloc(sizeof(vector_t *)); 
    .... 
    mq_attribute.mq_msgsize = sizeof(vectors_t *); 
    mq_attribute.mq_maxmsg = 10; 
    mq_attribute.mq_curmsgs = 0; 
    mq_attribute.mq_flags = 0; 
    .... 
    mqd1 = mq_open(mq_name1, O_RDWR | O_CREAT , 0777, &mq_attribute); // create mq 

    rc = pthread_create(&threads[0], NULL, (void *) &readSensors, (void *) vectors); 

    ... 
    } 


void readSensors(void *data) 
{ 
     vectors_t *vecs = (vectors_t *)data; 

     mqd_t mqd_send = mq_open(mq_name1, O_WRONLY); 
     printf("readSensors mq_open mq_name1: %s\n", strerror(errno)); 

     while(loop) 
     { 

      readGyro(vecs->gyro); 
      readAccel(vecs->accel); 
      readMagnet(vecs->magnet); 

      mq_send(mqd_send, (char *) vecs, sizeof(vectors_t *), 1); 
      printf("readSensors mq_send mq_name1: %s\n", strerror(errno)); 
     } 

     pthread_exit((void*) 0); 
} 

當我用gdb運行它,它給出了錯誤,而乳寧此行rc = pthread_create(&threads[0], NULL, (void *) &readSensors, (void *) vectors); 當然,我使用pthread_mq_函數的返回值,我在這裏沒有提到爲了最小化代碼。我正在使用Raspberry Pi,我認爲好的程序valgrind不能在Raspberry上運行。

謝謝。

回答

2

你沒有足夠的空間。您撥打的所有malloc()電話應使用sizeof(type)而不是sizeof(type *)

你在等待整個struct all_vectors有足夠的空間,但只能爲單個指針創建足夠的空間。然後你寫信給它,就好像有足夠的空間一樣,但它最終會寫入超出你的記憶的結尾。

所有的struct vector malloc都存在相同的問題,但是,在此示例中不寫入它們,因此沒有任何問題症狀。

+0

好的,謝謝你的回覆。我會嘗試。 –