0

クイック C の質問はこちら。私たちは最近、ダブル、トリプル、さらにはクアッド ポインターで遊んでいます。この問題に遭遇するまで、私たちは物事を把握していました...

char ***data;
data_generator(&data);
char **temp = data[0];          
printf("printing temp[%d]: %s\n",0, temp[0]);
printf("printing temp[%d]: %s\n",1, temp[1]);
dosomething(temp);

int dosomething(char **array) { 

    printf("printing array[%d]: %s\n",0, array[0]);
    printf("printing array[%d]: %s\n",1, array[1]);
    ......
}

int data_generator(char ****char_data) {
    char *command1[2];
    char *command2[2];

    command1[0] = "right";
    command1[1] = "left";

    command2[0] = "up";
    command2[1] = "down";

    char **commandArray[2];

    commandArray[0] = command1;
    commandArray[1] = command2;

    number_of_commands = 2;

    if(number_of_commands > 1){
    *char_data = commandArray;
    }

    return number_of_commands - 1;
}

そして、これは印刷されます...

printing temp[0]: right
printing temp[1]: left
Segmentation fault

関数を通過しているときにポインターに何が起こるかについて、いくつかの誤解があるようです。何かご意見は?

4

2 に答える 2

3
*char_data = commandArray;

スタック (自動) 配列のアドレスを外部のメモリ ロケーションに配置しています。commandArrayの寿命は戻るとすぐに終了するため、これは災害 (未定義の動作) のレシピですdata_generatorcommandArray同じことが、スタック配列要素へのポインタであるの要素にも当てはまります。

于 2010-10-01T04:30:37.377 に答える
0

変化する:

char *command1[2];
char *command2[2];

に:

static char *command1[2];
static char *command2[2];

これにより、command1[] と command2[] が保持メモリに保持されます。

それ、または malloc() 、他のポスターが推奨するように、malloc'cメモリを適切に使用するには、ここで説明するよりも多くの考慮事項が必要です。

于 2010-10-01T07:36:43.243 に答える