Как вернуть массив указателей на символы? Что не так в моем коде? - PullRequest
0 голосов
/ 15 февраля 2020

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

Итак, у меня есть функция, тип возвращаемого значения не может быть изменен (для случая 1). Для случая 2 я хотел бы знать, как вернуть char *a[];

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

char **myfunc(int n) {
    char **a = malloc(n * sizeof(char *));
    int i, j = 1;
    for (i = 0; i < n; i++)
        a[i] = malloc(9 * sizeof(char));
    for (i = 0; i < n; i++) {
        snprintf(a[i], 5, "%d", i);
        return a;
    }

int main() {
    int num = 10, i;
    char **ar = myfunc(num);
    for (i = 0; i < num; i++)
        printf("%s\n", ar[i]);

    return 0;
}

1) Как в myfunc() как мне правильно вернуть a? Мой компилятор выдает мне предупреждение, которое возвращает из несовместимого типа указателя.

2) Если я изменю свой выше myfunc() следующим образом, как я должен вернуть измененный буфер?

char ???myfunc(int n) {
    char *a[n];
    for (i = 0; i < n; i++)
        a[i] = malloc(10 * sizeof(char));

   return ?
}

3) Как в обоих случаях обрабатывать возврат внутри функции main()?

Случай 2:

char *myfunc(int n) {
    static char *a[n];
    int i;

    for (i = 0; i < n; i++)
        a[i] = malloc(9 * sizeof(char));

    for (i = 0; i < n; i++)
        snprintf(a[i], 5, "%d", i);

    return a;
}

int main() {
    int num = 10, i;
    char *ar = myfunc(num);
    for (i = 0; i < num; i++)
        printf("%s\n", ar[i]);

    return 0;
}

1 Ответ

1 голос
/ 16 февраля 2020

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

После исправления этой ошибки код компилируется и работает нормально :

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

char **myfunc(int n) {
    char **a = malloc(n * sizeof(char *));
    int i;
    for (i = 0; i < n; i++)
        a[i] = malloc(9 * sizeof(char));
    for (i = 0; i < n; i++)
        snprintf(a[i], 9, "%d", i);
    return a;
}

int main() {
    int num = 10, i;
    char **ar = myfunc(num);
    for (i = 0; i < num; i++)
        printf("%s\n", ar[i]);

    return 0;
}

Если вы измените myfunc() для определения a как char *a[n];, у вас возникнет серьезная проблема при возврате a из myfunc(), поскольку массив определен только внутри области действия myfunc(). Возвращение его адреса, который является просто return a;, вызовет неопределенное поведение в main(), потому что пространство, на которое он указывает, могло быть повторно использовано для других вещей, таких как printf() локальные переменные.

Третий вариант, где вы определяете a, поскольку static char *a[n]; не компилируется, потому что размер объектов stati c должен быть известен во время компиляции. Использование локальных static объектов не рекомендуется, так как это делает программу более трудной для понимания и не входящей, со скрытым внутренним состоянием и т. Д. c. Одной из таких функций является strtok() из <string.h>.

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