-3

なぜグーラッシュが 123.222 に等しくないのか、私のアドラー脳に誰か説明してくれませんか?

グーラッシュを説明すると、スレッドごとに 123.222 に設定されたポインター変数ですが、スレッドがアクティブ化され、スレッド関数の null ポインターを介してポインターが渡されると、出力は悲しいことにスレッドごとに 0 になり、本来あるべき 123.222 ではありません。

コード:

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


typedef struct
{

int blossom;
double goulash;

}juniper;

juniper **jeffery;
juniper **james;

typedef struct{

int rodent_teeth;
juniper **raymond;

}rosebud;


void * thread_function(void *p){

juniper *monty = (juniper *) p;

printf("Goulash = %f\n",monty->goulash);

}


int main(){

int i;
rosebud *hattys_friend;

hattys_friend = (rosebud*) calloc(1,sizeof(rosebud));

hattys_friend->raymond = (juniper**) calloc(10,sizeof(juniper*));

for(i=0;i<10;i++){
hattys_friend->raymond[i] = (juniper*) calloc(10,sizeof(juniper));
        }

hattys_friend->raymond[2]->goulash = 5.6;

pthread_t threads[10];

for(int i=0;i<10;i++){

hattys_friend->raymond[i]->goulash = 123.222;
hattys_friend->rodent_teeth = i;

pthread_create(&threads[i],NULL,thread_function,(void*) &hattys_friend->raymond[i]);

printf("creating thread %d\n",i);

}

for(int i=0;i<10;i++){

pthread_join(threads[i],NULL);


}





jeffery = &hattys_friend->raymond[2];

james = hattys_friend->raymond;






printf("jeffery -> goulash = %f\n",(*jeffery)->goulash);


printf("james -> goulash = %f\n",(*(james+2))->goulash);

hattys_friend->raymond[2]->goulash = 1.6;

printf("james -> goulash = %f\n",(*(james+2))->goulash);


}
4

2 に答える 2

4
void * thread_function(void *p){
    juniper *monty = (juniper *) p;
    printf("Goulash = %f\n",monty->goulash);
}

を受け取るthread_functionことを期待していますがjuniper*

pthread_create(&threads[i],NULL,thread_function,(void*) &hattys_friend->raymond[i]);

hattys_friend->raymond[i]すでに であるjuniper*ため、 を渡しています。juniper**アクセスmonty->goulashは未定義の動作です。

于 2012-09-29T20:02:51.430 に答える