Cで文字列の動的配列を使用しています:
char** strings;
私はそれを初期化します:
int max = 10;
strings = malloc(sizeof(char*) * max);
そして、いくつかのダミー文字列をコピーします:
char* str = "dummy";
for (int i = 0; i < max; i++) {
strings[i] = malloc(strlen(str) + 1);
strncpy(strings[i], str, strlen(str) + 1);
}
しかし、これを印刷しようとすると:
for (int i = 0; i < max; i++)
printf("array = %s", strings[i])
Splint から次のエラーが表示されます。
Value strings[] used before definition
An rvalue is used that may not be initialized to a value on some execution
path. (Use -usedef to inhibit warning)
このようなチェックNULL
は役に立ちません:
for (int i = 0; i < max; i++)
if (strings[i] != NULL)
printf("array = %s", strings[i])
sincestrings[i]
はまだ「定義前」に使用されています。
これを解決する方法についてのアイデアはありますか?
編集:代わりにリンクされたリストでこれを試してみると思います。
また、完全なコード リスト:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char** strings;
int i;
int max = 10;
char* str = "hello";
// Dynamic array with size max
strings = malloc(sizeof(char*) * max);
// Abort if NULL
if (strings == NULL)
return (-1);
// Define strings
for (i = 0; i < max; i++)
{
strings[i] = malloc(strlen(str) + 1);
// Abort if NULL
if (strings[i] == NULL)
{
// Undetected memory leak here!
free(strings);
return (-1);
}
strncpy(strings[i], str, strlen(str) + 1);
}
// Print strings
for (i = 0; i < max; i++)
{
if (strings[i] != NULL)
printf("string[%d] = %s\n", i, strings[i]);
}
// Free strings
for (i = 0; i < max; i++)
{
if (strings[i] != NULL)
free(strings[i]);
}
free(strings);
return 0;
}