0

文字列の配列 (char **args) を持つ構造体があります。文字列の配列 (char *input[32]) を構造体のその要素にコピーできる必要があります。例えば:

Thing s;
s.args = input; //assuming input already has some strings in it

そうしようとすると、次に s.args = input が呼び出されたときに、古い入力が完全に上書きされます。この機能を適切な方法で実現するにはどうすればよいですか?

編集

これが構造体の外観です。

typedef struct{
char **args;
} Thing;

次に、関数で次のように宣言しました。

char *args[512];
.....
args[count] = string //string is a char *

そして最後に、私はやりたい:

s.args = input.
4

1 に答える 1

5

あなたはそれをコピーしていません。実際には、ポインタを設定しているだけです。事実上あなたはこれを持っています:

char **args;
char *other[32];
args = other;

実際にアレイをコピーする必要があります。そのためには、アレイにメモリを割り当てる必要があります。

s.args = malloc( 32 * sizeof(char*) );

for( i = 0; i < 32; i++ ) s.args[i] = input[i];

これは浅いコピーです。文字列ポインタをコピーしますが、複製はしません。で文字列の内容をinput変更すると、その変更はに反映されs.argsます。文字列をコピーするには、次のようにする必要があります。

for( i = 0; i < 32; i++ ) s.args[i] = strdup(input[i]);

メモリを割り当てたので、s.args再度上書きする前に(そしてプログラムが終了したときにも)、割り当てたものを解放する必要があります。これには文字列が含まれます(呼び出した場合strdup)。

if( s.args != NULL ) {
    // Only do the loop if you did a deep copy.
    for( i = 0; i < 32; i++ ) free(s.args[i]);

    // Free the array itself
    free(s.args);
}
于 2012-09-18T02:27:20.993 に答える