Вы спрашиваете «что здесь происходит» в:
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