0

構造体を使用していくつかの変数を転送したい。以下はサンプルプログラムコードです。このプログラムを実行すると、セグメンテーション違反が発生します。gccコンパイラを使用しています。

誰でもこれで私を助けることができますか?

struct data{
    const char * ip;
    const char * address;
    const char * name;
};

int fun(struct data *arg) {
    //struct data *all;
    const char *name = arg->name;
    printf("\n My name is:%s",name);
    return 1; 
}


int main(int argc, char * const argv[]) {
    struct data * all;   
    int k=0;
    //data.name = argv[1];

    all->name=argv[1];
    k = fun(all);

    printf("\n k is:%d ",k);

    return 0;
}
4

3 に答える 3

3

問題はここにあります:

struct data * all;
all->name=argv[1];

にメモリが割り当てられていませんall。初期化されていないポインターがある場合、それはメモリ内のランダムな場所を指しているため、おそらくアクセスすることはできません。次の 2 つのオプションがあります。

  1. スタックに割り当てます。

    struct data all;
    all.name=argv[1];
    k = fun(&all);
    
  2. ヒープに割り当てます。

    struct data *all = malloc(sizeof(*all));
    if (all != NULL)
    {
        all->name=argv[1];
        k = fun(all);
    }
    free(all);
    

最初のケースはall、現在の関数 (および呼び出す関数) でのみ必要になることがわかっている場合に適しています。したがって、スタックに割り当てれば十分です。

2 番目のケースは、それを作成する関数の外部で必要な場合 (allたとえば、関数を返す場合) に適しています。all関数を初期化して、他の人が使用できるように返すことを想像してください。このような場合、関数が戻った後に破棄されるため、スタックに割り当てることはできません。

詳細については、この質問を参照してください。

于 2012-07-18T09:56:38.530 に答える
3

メモリを割り当ててポインタに割り当てる必要がありますall:

struct data * all;   
int k=0;
all = malloc(struct data);

all->name=argv[1];
k = fun(all);
//...
free(all);

または、ローカル構造体を使用して、そのポインターを関数に渡します。

struct data all;   
int k=0;

all.name=argv[1];
k = fun(&all);
于 2012-07-18T09:57:05.440 に答える
2

all型へのポインタstruct dataです。あなたはそれを割り当てたことがないので、何も指していません。

次のいずれかを実行する必要があります。

  • スタックに割り当てallます:

    struct data all;

  • allヒープに割り当てます:


    struct data* all = malloc(sizeof (struct data));   
    // don't forget to check if the allocation succeeded, 
    //and don't forget to free it when you're done
于 2012-07-18T09:56:47.853 に答える