所以我正在开发一个线程项目,我正在测试我的一个文件,确保结构和字段获得正确的值。我正在运行这个功能:
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”的值不应该根据我的打印方式而改变?我做错了什么?
答案 0 :(得分:1)
一个很好的例子......这不是一个答案,但表明一切似乎都没问题
#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;
}
答案 1 :(得分:0)
请勿使用%d
打印sem_t
,pthread_mutex_t
或指针类型的变量。在最好的情况下,您将获得实现定义的行为(如果sem_t
和pthread_mutex_t
恰好是int
的typedef,并且指针碰巧与int的大小相同。但总的来说,你会得到未定义的行为,因为这些类型可能与int
无关 - 这是%d
告诉printf()
相应参数的类型。
这就是为什么printf()
调用产生的输出没有任何意义。你将printf()
的论点传递给没有任何意义的论点。