У меня есть функция, возвращающая char**
.I. указатель на массив символов. Здесь я читаю файл в количестве каталогов для определенного целочисленного значения ind
. Если он находит значение в файле, он должен вернуть имя каталога. Я попытался использовать статическое распределение, но это не поможет, потому что возвращение этих переменных приводит к неопределенному поведению. В моем случае я получаю все значения такими же, как имя последнего каталога. Вероятно, это происходит потому, что я читаю из выделенного системного стека. Затем я использовал динамическое выделение и Вот код, который я написал:Функция, возвращающая указатель на строку
//Global variable
int found = 0;
char** get_strings(int ind)
{
FILE *fp;
char filename[64];
char name[16];
//char *name;
char **array;
int i = 0, found = 0, l = 0;
int val = 0;
char **array = (char **)malloc(10 * sizeof(char *));
for(l = 0; l < 10; l++)
array[l] = (char *)malloc(16 * sizeof(char));
//name = (char *)malloc(16 * sizeof(char));
for(i=1;i<=10;i++)
{
snprintf(filename, sizeof(char) * 64, "/home/ben/dir%d/name", i);
fp = fopen(filename, "r");
if(fp == NULL)
{
perror("Error opening file");
}
fscanf(fp, "%d", &val);
fclose(fp);
//printf("value-%d is %d\n", i, val);
if (val != 0 && val == ind)
{
snprintf(name, sizeof(char) * 16, "dir%d", i);
printf("Dir %s is a has %d\n", name, ind);
strncpy(array[found],name, strlen(name));
found++;
}
}
return array;
}
и я называю его основной функции как:
int i = 0;
char **array;
array = get_strings(1);
for(i=0;i< found;i++)
printf("array[%d] = %s\n", i, array[i]);
я получаю значение мусора на выходе. Может ли кто-нибудь помочь?
'sizeof (char)' reduntant и всегда будет оцениваться до 1. Кроме того, вам не нужно прибегать к типу, чтобы преобразовать в/из 'void *' в C. Это неявно. – Qix