Я использую динамический массив строк в 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])
поскольку strings[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;
}
strncpy(strings[i], str, strlen(str) + 1);
лучше писать какstrcpy(strings[i], str);
- person M.M   schedule 15.08.2014strings[]
наNULL
после вашегоmalloc
- возможно, шина не понимает в циклеPrint Strings
, что невозможно добраться до нее без фактического назначения строки - person M.M   schedule 15.08.2014