В C у меня возникают проблемы с получением указанного значения структуры члена (двойной указатель).Значение теряется за пределами функции, присваивающей значение - PullRequest
0 голосов
/ 03 октября 2018
#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».Функция thread заставляет 'presult' указывать на значение, и оно, кажется, работает, потому что печать работает.

Однако, возвращаясь к основной функции, я пытаюсь снова напечатать значение 'presult', ноон печатает не 45.50, а 0.0.

В моем полном коде я фактически получаю ошибку сегментации с последним отпечатком.Но даже в этом упрощенном коде это не работает.Он не печатает 45.50.

Вывод выглядит следующим образом:

45.50
****************************************
0.000
0.000

Любая помощь приветствуется.Спасибо.

1 Ответ

0 голосов
/ 03 октября 2018
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, вы просто передадите это значение в качестве указателя, а не структурированного элемента..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...