2016-08-26 10 views
1

2つのスレッドを作成し、main()がスレッドにargcとargvを渡すので、argcargvを含むstruct argを使用します。pthread引数のアドレスが以前と異なる

#include <pthread.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
struct arg { 
    int argc; 
    char id[9]; 
    char **argv; 
}; 

int test1(struct arg *a) { 
    int argc; 
    char **argv; 
    argc = a->argc; 
    argv = a->argv; 

    if (argc > 3) { 
     printf("arg 1 is %s, arg 2 is %s arg 3 is %s\n\n", *(argv+1), *(argv+2),a->id); 
    } 
    else { 
     exit(0); 
    } 


    return 0; 
} 
int main(int argc, const char *argv[]) { 
    int i; 
    void *ret; 
    struct arg *a = (struct arg *) malloc(sizeof(struct arg *) * atoi(argv[3])); 
    pthread_t *thread = (pthread_t *) malloc(sizeof(*thread) * atoi(argv[3])); 

    for(i = 0; i < atoi(argv[3]); ++i) { 
     a[i].argc = argc; 
     a[i].argv = argv; 
     sprintf(a[i].id,"%d",i); 
     pthread_create(&thread[i], NULL , test1 ,(struct arg *)&(a[i])); 
    } 

    for(i = 0; i < atoi(argv[3]); ++i) { 
     pthread_join(thread[i], &ret); 
    } 

    return 0; 
} 

私は私のプログラムをexecし:出力がどのように見える

./test 1 2 2 

:スレッド1で

arg 1 is 1, arg 2 is 2 arg 3 is 0 

arg 1 is , arg 2 is arg 3 is 1 

argvが正しいですが、スレッド2にargvアドレスは、以前よりも異なっています。私はA-を印刷するためにGDBを使用

>メインargvのアドレスでARGVアドレス

  • は、スレッド1のargvアドレスに0x7fffffffdee8
  • ある2 ARGVアドレスが0x7ffff6fef700
あるスレッドで0x7fffffffdee8
  • あります

    [スレッド0x7ffff6fef700(LWP 19472)に切り替える]

    argvアドレスはthです電子スレッドアドレスと同じ

    私は引数を確認し、[1] - > argvのpthread_createの

    前のアドレスが0x7fffffffdee8です。

    Will pthread_create住所を変更しますか?

    紛失しているものがありますか?

  • +0

    あなたがその番号を必要とするたびに変換するのではなく、 'argv [3]'を一度整数に変換して(ゼロ、負、または大きすぎないことを確認してください) –

    答えて

    3

    、あなたはあまりにも小さなスペースを割り当てています

    struct arg *a = (struct arg *) malloc(sizeof(struct arg *) * atoi(argv[3])); 
    

    それはより多くのようにする必要があります:

    struct arg *a = (struct arg *) malloc(sizeof(*a) * atoi(argv[3])); 
    

    あなたはmain()の定義を改ざんべきではありません。 constは、その型の一部ではありません(What should main() return in C and C++を参照してください。引数と戻り値についても説明しています)。

    また、スレッド機能をvoid *test1(void *vp)に準拠させる必要があります。これはスレッド関数の型です。例:

    static void *test1(void *vp) 
    { 
        struct arg *a = vp; 
        int argc = a->argc; 
        char **argv = a->argv; 
        … 
    

    pthread_create()コールのキャストは不正です。

    4

    このライン

    struct arg *a = (struct arg *) malloc(sizeof(struct arg *) * atoi(argv[3])); 
    

    は、メモリの適切な量を割り当てません。それはsizeof(struct arg)でなければなりません。 n個の構造体の配列を割り当てているので、構造体自体のサイズは必要です。

    これをコンパイルするには、多くのものをクリーンアップする必要がありました。コンパイラの警告を有効にして修正する必要があります。この行で

    +0

    ありがとうございます!それは私のために役立つ。 – Tom

    関連する問題