在C语言中,我很难获取成员struct(双指针)的指针值。在分配值的函数之外,该值丢失

时间:2018-10-03 02:58:39

标签: c pointers

#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

感谢您的帮助。谢谢。

1 个答案:

答案 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。