固定長文字列の可変長配列を使用して構造体を作成しようとしています。今割り当てられた2D配列に書き込む
struct foo_query{
char tag[10];
int value_count;
char * values[VAL_SIZE];
};
、私はこれらの構造体の配列を作成し、値のためにいくつかのメモリを割り当てたい:
#define buffer(a) (char *) malloc(sizeof(char[a][VAL_SIZE]))
foo_query queries[total_queries] = {
{"FOO", 25, buffer(25)},
{"BAR", 21, buffer(21)}
};
#undef buffer
は最後に、私は実際の値にいくつかのデータを書きたいです。
query_index = 0;
for(int i = 0; i < queries.value_count; i++){
strncpy(queries[query_index].values[i], "Hello", VAL_SIZE);
Serial.outln("success");
}
しかし、最後のビットは失敗します。 success
が1回または2回印刷され、すべてが停止します。
私の知る限りでは、メモリは割り当てられていますが、何もあふれているわけではないので、なぜコードがクラッシュするのですか?
[この1つ]のような質問がありました。(https://stackoverflow.com/questions/12462615/how-do-i-correctly-set-up-access-and-free-a-multidimensional -array-in-c?noredirect = 1&lq = 1)、しかし、私はそれがその質問に対して何を言っているのか、私のコードはまだ動作しません。 –
'strncpy'は文字列がNULで終了することを保証しません –
この場合、なぜそれが関連するのか分かりません。問題は、書き込みではなく、読み込みで発生しています(実際には配列から読み取ることはありません)ので、NULL終了によって違いはありません。 –