多次元配列にデータを書き込もうとしていて、配列を別の関数にconst char**
として渡します。私がchar*
を宣言されている関数でローカルに印刷すると、すべて正常に動作します。しかし、別の関数でchar*
の配列を印刷しようとすると、それらはすべて空文字列になります。多次元char配列は関数内で出力されますが、別の関数に渡されたときは出力されません
私は、次のコードを使用しています:
void my_print (const char** lines, unsigned int num)
{
int i = 0;
for (i = 0; i < num; i++) {
fprintf(stderr, "lines[%d]: %s", i, lines[i]);
}
}
void my_func()
{
char cfg[2][200];
unsigned int value = 5;
snprintf(cfg[0], 200, "one two three\n");
snprintf(cfg[1], 200, "my value = %u\n", value);
fprintf(stderr, "lines[0] = %slines[1] = %s\n", cfg[0], cfg[1]);
my_print((const char**) cfg, 2);
}
これは、次の出力が生成されます。
lines[0] = one two three
lines[1] = my value = 5
lines[0]:
lines[1]:
代わりに、与えられたmy_func
の、私は次のように使用している場合:
void my_func()
{
char* cfg[2];
unsigned int value = 5;
cfg[0] = malloc(200);
cfg[1] = malloc(200);
snprintf(cfg[0], 200, "one two three\n");
snprintf(cfg[1], 200, "my value = %u\n", value);
fprintf(stderr, "lines[0] = %slines[1] = %s\n", cfg[0], cfg[1]);
my_print((const char**) cfg, 2);
}
それから、すべて動作し、私は得ます:
lines[0] = one two three
lines[1] = my value = 5
lines[0]: one two three
lines[1]: my value = 5
ここで背景には何が起こっていますか? my_print
が文字列を印刷できるようにするために、なぜmalloc
を使用する必要がありますか?
おかげであなたは
2D配列がポインタへのポインタに崩壊しないという事実が答えです。ありがとう! – DuneBug