Каков правильный синтаксис c для массива указателей на массивы фиксированного размера? - PullRequest
0 голосов
/ 17 ноября 2018

Мне просто интересно, каков правильный синтаксис C в WHAT_GOES_HERE? ниже?Я попробовал несколько вещей, и он не компилируется.

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

#define MAX_SZ 256
typedef char Name[MAX_SZ];

int main(int argc, char **argv) {
    Name *a = (Name *)malloc(10 * sizeof(Name));
    char *b[MAX_SZ] = (WHAT_GOES_HERE?)malloc(10 * sizeof(char[MAX_SZ]));
    printf("sizeof(%s) = %Zu\n", "a[3]", sizeof(a[3])); 
    // outputs "sizeof(a[3]) = 256"
    return 0;
}

1 Ответ

0 голосов
/ 17 ноября 2018

Вы спрашиваете «что здесь происходит» в:

char *b[MAX_SZ] = (WHAT_GOES_HERE?)malloc(10 * sizeof(char[MAX_SZ]));

Требуется динамически размещаемый указатель на массив из 10 массивов фиксированного размера (из char).

Первая проблема - «что происходит на LHS знака =», потому что вы определили, что b - это массив MAX_SZ указателей на char, а это не то, что вы сказал, что хотел.

Итак, вам нужно:

char (*b)[MAX_SZ] = malloc(10 * sizeof(char[MAX_SZ]));

Теперь вы можете ссылаться на b[0] - b[9] как массивы MAX_SZ символов.

Если вы хотите добавить приведение (но посмотрите примечания и ссылки в моем комментарии ), вам нужно сопоставить тип с левой стороны минус имя переменной:

char (*b)[MAX_SZ] = (char (*)[MAX_SZ])malloc(10 * sizeof(char[MAX_SZ]));

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

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

enum { MAX_SZ = 256 };

int main(void)
{
    /* Pass 1 */
    {
    char (*b)[MAX_SZ] = malloc(10 * sizeof(char[MAX_SZ]));
    strcpy(b[0], "The zeroth");
    strcpy(b[9], "The ninth and final element of the array");
    printf("From '%s' to '%s', all is well\n", b[0], b[9]);
    free(b);
    }

    /* Pass 2 */
    {
    char (*b)[MAX_SZ] = (char (*)[MAX_SZ])malloc(10 * sizeof(char[MAX_SZ]));
    strcpy(b[0], "The zeroth");
    strcpy(b[9], "The ninth and final element of the array");
    printf("From '%s' to '%s', all is well\n", b[0], b[9]);
    free(b);
    }

    return 0;
}

Вывод скучный (извините):

From 'The zeroth' to 'The ninth and final element of the array', all is well
From 'The zeroth' to 'The ninth and final element of the array', all is well
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...