1

最初に、この質問はある時点で答えられていることを知っていると言うことから始めましょう。そうでなければならなかったのですが、それに対する答えを見つけるためのキーワードがわかりません。

私はプログラムを書いていますが、プログラム内で動的にサイズ変更された複数の配列をあちこちに作成し、それらを 1 つのグランド構造体に格納する必要があります。したがって、同じタイプの動的に割り当てられた配列を作成する必要がある場合は、構造体フィールドに関数で作成します (つまり、宣言し、malloc し、それを返します)。しかし、私が道を進んでいる今、私は大きな欠陥を作ったと思います。私がしたことは関数のスコープによって破壊されたと思います。つまり、関数が完了すると、元のポインターが強制終了されるため、構造体はもはや「私のもの」ではないアドレスへのポインターになります。以下は、関数のサンプル呼び出しです。コメントがなくても意味があることを願っています。

//Call from main()
current_event->mens_names = create_names_matrix(number_of_couples, 20);

//my "create_names_matrix" function:
char ** create_names_matrix(int num_of_names, int length_of_names){
int i;
char **return_matrix;

return_matrix = malloc(num_of_names * sizeof(char*));
if(return_matrix == NULL){
    panic("return_matrix"); //Panic is a function that checks if malloc failed
}

for(i = 0; i < num_of_names; i++){
    return_matrix[i] = malloc(length_of_names * sizeof(char));
}

if(return_matrix[i-1] == NULL){
    panic("return_matrix"); //Panic is a function that checks if malloc failed
}
return return_matrix;

}

解決策は、メインの各フィールド配列を宣言して動的に作成し、それを各「create_xxx_matrix」関数にパラメーターとして渡して、関数のスコープが完了した後にそれらが強制終了されないようにすることですか?

これは初歩的な質問であることは知っていますが、ポインターと c を使用してからしばらく経ちました。

ありがとう!

4

2 に答える 2

2

動的に割り当てられたポインターはヒープに割り当てられ、関数のスコープによって強制終了されません。スコープにより、スタックに割り当てられた変数は、関数を離れると破棄されます。

于 2013-02-03T04:08:42.140 に答える
0

これはうまくいきます。あなたが本当に心配しているのは、ポインター自体ではなく、ポインターが指すメモリーです。ポインターは、実際にはメモリの場所を示す単なる数値です (0x0043AF など)。使用malloc()したメモリはヒープ上にあり、指定free(ptr)されているすべてのメモリを解放するように具体的に呼び出すまで割り当てが解除されることはありません。

于 2013-02-03T07:30:31.223 に答える