Возврат массива строк и присвоение его переменной в C - PullRequest
3 голосов
/ 26 мая 2020

Итак, проблема, с которой я столкнулся, заключается в следующем:

В одном компоненте я читаю имена файлов и сохраняю их в массиве. Может быть максимум 100 имен длиной максимум 20 символов. Это определяется следующим образом:

static Char_t fileList[100][20] = {};

, где

fileList[1]= "name1" 
fileList[2]= "name2"  and so on.

Создавая функцию, которая возвращает указатель на нее, я хочу получить доступ к этому массиву строк из другого компонента моего code:

Char_t** getAllFiles(void)
{
    return &fileList;
}

И я назначаю указатель следующим образом:

Char_t **fileList = getAllFiles();

Кажется, это не работает. Лучшее, чего я добился, - это получить указатель на первый компонент массива. Но я не могу достать остальные компоненты.

Ответы [ 2 ]

2 голосов
/ 26 мая 2020

Один простой вариант - использовать указатель на тип возвращаемого значения массива.

Вот воспроизводимый пример:

#include <stdio.h>

char (*getAllFiles())[];

int main(void)
{
    char (*str_array)[20] = getAllFiles();
    printf("%s %s", str_array[0], str_array[1]); //test print
}

char (*getAllFiles())[]
{
    static char fileList[100][20] = {"name1", "name2"};
    return fileList;
}

Если вы не хотите / не должны использовать stati c хранилище, вы можете использовать тот же тип, но с выделением памяти, это позволит вам освободить память, зарезервированную для вашего массива, когда она вам больше не нужна. Обратите внимание, что использование хранилища stati c может иметь свои недостатки, поскольку @ RobertS поддерживает указанную Моникой Челлио .

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char (*getAllFiles())[];

int main(void)
{
    char (*str_array)[20] = getAllFiles();
    printf("%s %s", str_array[0], str_array[1]); //test print
    free(str_array); //free the allocated memory after it's used
}

char (*getAllFiles())[]
{
    //allocating space for an array of type char, which is always 1 byte, 
    //you must allocate memory according to the array type
    //for instance malloc(sizeof(Char_t) * 100 * 20);
    char (*fileList)[20] = malloc(100 * 20);

    strcpy(fileList[0], "name1");
    strcpy(fileList[1], "name2");

    return fileList;
}

Вывод в обоих случаях:

name1 name2
1 голос
/ 26 мая 2020

Вероятно, лучший способ - выделить массив динамически, потому что вы можете освободить массив после того, как он больше не нужен.

Указание на локальные объекты функции извне функции также считается « плохой практикой », потому что это не является потокобезопасным.

Подробно сначала выделите массив из 20 указателей на Char_t и назначьте его на **fileList. Затем выделите память 100 Char_t для каждого указателя.

Верните fileList и назначьте его указателю на указатель на Char_t в вызывающей стороне.

После этого вы можете просто использовать file_list[i] для доступа к указанным c строкам.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char** getAllFiles (void);

typedef char Char_t;

int main (void)
{
    Char_t** file_list = getAllFiles();

    printf("%s\n", file_list[0]);
    printf("%s", file_list[1]); 

    for (int i = 0; i < 20; i++)
    {
        free(file_list[i]);     // deallocate pseudo-rows of 100 Char_t.
    }

    free(file_list);            // deallocate pointer array.

}

char** getAllFiles (void)
{
    Char_t** fileList = malloc (sizeof (*fileList) * 20);

    for (int i; i < 20; i++)
    {
        fileList[i] = malloc (sizeof (**fileList) * 100);
    }

    strcpy(fileList[0], "name1");
    strcpy(fileList[1], "name2");

    return fileList;
}

Вывод:

name1
name2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...