#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
typedef struct {
double *presult;
} SomeData;
//Fonction that assigns the value to be pointed
void *assignValue(void *data) {
SomeData *aData = (SomeData*)data;
double valeurTotal = 45.50;
aData->presult = &valeurTotal; //Make the pointer point to the value
printf("%10.3f \n",*aData->presult); //Here it prints the right answer L 45.50
pthread_exit(NULL);
}
int main(int argc, char *argv[]) {
SomeData myData; // The struct
pthread_t onethread;
pthread_create(&onethread, NULL, assignValue,(void *)&myData);
pthread_join(onethread, NULL);
printf("**************************************** \n");
printf("%10.3f \n", (myData.presult)); // prints: 0
printf("%10.3f \n", *(myData.presult));// prints: 0
exit(0);
}
问题可能令人困惑,因此希望我的代码的简化版可以更好地解释。所以基本上,我创建了一个修改结构值的线程。
在线程函数内部,该结构作为指针传递。结构的成员之一是双指针“ presult”。线程函数使'presult'指向一个值,并且看起来很有效,因为打印有效。
但是,回到主函数中,我尝试再次打印'presult'的值,但是它不会打印45.50,而是显示0.0。
在我的完整代码中,我实际上在上次打印时遇到了细分错误。但是,即使在这种简化的代码中,它也不起作用。它不会打印45.50。
输出如下:
45.50
****************************************
0.000
0.000
感谢您的帮助。谢谢。
答案 0 :(得分:2)
double valeurTotal = 45.50;
aData->presult = &valeurTotal; //Make the pointer point to the value
当valeurTotal
超出范围时,分配给assignValue
的存储位置将被重用。
最可能的情况是
printf("%10.3f \n", *(myData.presult)); // prints: 0
在这一行,您还尝试将指针打印为浮点数,这很古怪。
printf("%10.3f \n", (myData.presult)); // prints: 0
您需要将值实际存储在结构中,您可以通过
typedef struct {
double presult; // will copy into this when its assigned.
} SomeData;
很显然,如果您只想要一个double值,则只需将该double用作指针而不是strucutre。