-1

因此,我正在开发一个线程项目,并且正在测试我的一个文件,以确保结构和字段获得正确的值。我正在运行这个功能:

struct ReportQueue {
   sem_t count;
   pthread_mutex_t mutexAdd;
   ReportList *RQList;
};

ReportQueue *RQCreate() {
   ReportQueue *rq;

   printf("RQCreate() called\n");
   rq = calloc(1, sizeof(ReportQueue));
   sem_init(&rq->count, 0, 0);
   pthread_mutex_init(&rq->mutexAdd, NULL);
   rq->RQList = NULL;
   return rq;
}

有了这个主要:

int main() {
   ReportQueue *rQueue;
   Report report;

   rQueue = RQCreate();
   printf("SemCount: |%d| RQList: |%d| MutexAdd |%d|\n", rQueue->count, rQueue->RQList, rQueue->mutexAdd);
   printf("SemCount: |%d|\n", rQueue->count);
   printf("RQList: |%d|\n", rQueue->RQList);
   printf("MutexAdd: |%d|\n", rQueue->mutexAdd);

   return;
}

我得到这个输出:

RQCreate() called
SemCount: |0| RQList: |128| MutexAdd |0|
SemCount: |0|
RQList: |0|
MutexAdd: |0|

这对我来说没有任何意义。“RQList”的值不应该根据我如何打印出来而改变?我究竟做错了什么?

4

2 回答 2

1

a minimal example that works fine... this isn't an answer but shows that all seems ok

+ it didn't fit in a comment :D

#include <stdlib.h>
#include <stdio.h>
#include <semaphore.h>
#include <pthread.h>

struct ReportQueue {
   sem_t count;
   pthread_mutex_t mutexAdd;
   int *RQList;
};

struct ReportQueue *RQCreate() {
   struct ReportQueue *rq;

   printf("RQCreate() called\n");
   rq = calloc(1, sizeof(struct ReportQueue));
   sem_init(&rq->count, 0, 0);
   pthread_mutex_init(&rq->mutexAdd, NULL);
   rq->RQList = NULL;
   return rq;
}

int main() {
   struct ReportQueue *rQueue;

   rQueue = RQCreate();
   printf("SemCount: |%d| RQList: |%d| \n", rQueue->count, (int)rQueue->RQList);
   printf("SemCount: |%d|\n", rQueue->count);
   printf("RQList: |%d|\n", (int)rQueue->RQList);

   return 1;
}
于 2013-03-17T21:48:46.443 回答
0

不要%d用于打印出类型为sem_tpthread_mutex_t或指针的变量。充其量您将获得实现定义的行为(如果sem_t并且pthread_mutex_t恰好是 typedefint并且指针恰好与 int 大小相同)。但总的来说,您会得到未定义的行为,因为这些类型可能与这些类型无关int- 这就是%d告诉printf()相应参数的类型的原因。

这就是为什么printf()调用会产生没有任何意义的输出。你传递的论点printf()没有任何意义。

于 2013-03-20T04:37:16.840 回答