1
#include<pthread.h>
#include<stdio.h>
#include<sys/stat.h>
#include<errno.h>

#define SIZE 3

/***I'm trying to send name of each file in a thread and trying to receive their respective size in main *******/

void *doit(void *name)
{
        int *size;
        struct stat st;
        char temp_name[30];
        memset(temp_name, '\0', sizeof(temp_name));
        strcpy(temp_name, (char *)name); //type casted
        stat(temp_name, &st);
        *size = st.st_size; //calculated the size

        printf("File name is: %s\n", temp_name);
        printf("File size is: %d\n", *size);
        pthread_exit((void *)size); //exited from thread
}

int main(int argc, char *argv[])
{
        pthread_t th_id[SIZE];
        int ret_val;
        int i;
        void **size[SIZE];
        for(i=0; i<SIZE;i++)
        {
                size[i] = (void **)malloc(30*sizeof(void *)); //allocated memory to void double pointer
                if(size[i] == NULL)
                {
                        printf("Memory not allocated to %dth member of size\n", (i+1));
                }
        }
        for(i=0; i<3; i++)
        {
          /*****Creating Thread**********/
                ret_val = pthread_create(&th_id[i], NULL, &doit, (void *)argv[1+i]);
                if(ret_val != 0)
                {
                        perror("Thread creation error\n");
                        exit(0);
                }
                pthread_join(th_id[i], size[i]);
                printf("Size is %d\n",**(int **)size[i]); //typecasted and printed
        }
        pthread_exit(NULL);
        return 0;
}

このプログラムでは、pthread_join での最初の呼び出し後にセグメンテーション違反が発生しています。最初のファイルを渡すとき、メインで適切なサイズを取得しています。しかし、2 番目のファイルの呼び出し中に、セグメンテーション違反が発生します。gdb を使用すると、malloc にもかかわらず「**size[1] と **size[2] が NULL になっています。しかし、メインの開始時に、メモリの割り当て中にエラー メッセージが表示されません。つまり、メモリは最初に割り当てられています。どうすればよいか教えてください。

4

1 に答える 1

1
    int *size;
    struct stat st;
    char temp_name[30];
    memset(temp_name, '\0', sizeof(temp_name));
    strcpy(temp_name, (char *)name); //type casted
    stat(temp_name, &st);
    *size = st.st_size; //calculated the size

初期化されていないポインターを逆参照しています。あなたは何かを指摘することは決してありませんsize

于 2012-09-10T14:50:53.690 に答える