Многомерный массив char печатается внутри функции, но не при передаче в другую функцию - PullRequest
1 голос
/ 21 января 2011

Я пытаюсь записать данные в многомерный массив, а затем передать массив как const char** другой функции.Когда я печатаю char* локально в функции, в которой он объявлен, все работает как положено.Но когда я пытаюсь напечатать массив char* в другой функции, все они являются пустыми строками.

Я использую следующий код:

void my_print (const char** lines, unsigned int num)
{
    int i = 0;

    for (i = 0; i < num; i++) {
        fprintf(stderr, "lines[%d]:  %s", i, lines[i]);
    }
}

void my_func ()
{
    char cfg[2][200];
    unsigned int value = 5;

    snprintf(cfg[0], 200, "one two three\n");
    snprintf(cfg[1], 200, "my value = %u\n", value);

    fprintf(stderr, "lines[0] = %slines[1] = %s\n", cfg[0], cfg[1]);

    my_print((const char**) cfg, 2);
}

Это приводит к следующему выводу:

lines[0] = one two three
lines[1] = my value = 5
lines[0]:
lines[1]:

Если вместо данного my_func я используюследующее:

void my_func ()
{
    char* cfg[2];
    unsigned int value = 5;

    cfg[0] = malloc(200);
    cfg[1] = malloc(200);
    snprintf(cfg[0], 200, "one two three\n");
    snprintf(cfg[1], 200, "my value = %u\n", value);

    fprintf(stderr, "lines[0] = %slines[1] = %s\n", cfg[0], cfg[1]);

    my_print((const char**) cfg, 2);
}

Тогда все работает, и я получаю:

lines[0] = one two three
lines[1] = my value = 5
lines[0]: one two three
lines[1]: my value = 5

Итак, что здесь происходит в фоновом режиме?Почему мне нужно использовать malloc, чтобы my_print мог печатать мои строки?

Спасибо

Ответы [ 2 ]

6 голосов
/ 21 января 2011

Массив не является указателем

Массивы распадаются на указатели на их первые элементы, но это происходит только в first измерении. Таким образом, двумерный массив не распадается на указатель на указатель, он только распадается на указатель на массив, поэтому вы должны передать эту функцию:

// lines is of type "pointer to array 200 of const char"
void my_print (const char (*lines)[200], unsigned int num)

Эта строка кода очень, очень неправильная:

my_print((const char**) cfg, 2);

Вы, вероятно, вставили приведение к const char**, чтобы заглушить компилятор. Не делайте , а не - компилятор пытается сказать вам, что вы делаете что-то не так! Закрывать это неправильно. С указанным выше изменением определения my_print вам не понадобится приведение:

my_print(cfg, 2);
0 голосов
/ 21 января 2011

Хорошее объяснение: указатель на указатель не то же самое, что и многомерный массив.

Проще говоря, двумерный массив с синтаксисом

char cfg [2] [200];

гарантированно размещается в соседних ячейках памяти.Двумерный массив указателей на указатели, выделенный с помощью malloc, будет не выделяться в соседних ячейках памяти, он будет по всей куче.Потому что каждый раз, когда вы вызываете malloc, вы выделяете новый сегмент.Создание общих функций для многомерных массивов в C довольно сложно из-за этого.

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