我只是想知道下面 WHAT_GOES_HERE?中正确的C语法是什么?我尝试了很多方法,但无法编译。
#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;
}
答案 0 :(得分:2)
您在以下位置询问“这里发生了什么”
char *b[MAX_SZ] = (WHAT_GOES_HERE?)malloc(10 * sizeof(char[MAX_SZ]));
您要动态分配指向10个固定大小的数组(char
)的数组的指针。
第一个问题是“ =
符号的LHS发生了什么”,因为您定义的是b
是MAX_SZ
指向{{1 }},这不是您想要的。
因此,您需要:
char
现在,您可以将char (*b)[MAX_SZ] = malloc(10 * sizeof(char[MAX_SZ]));
到b[0]
称为b[9]
个字符的数组。
如果要添加类型转换(但请参阅我的comment中的注释和链接),则需要匹配左侧的类型,减去变量名:
MAX_SZ
如果没有测试,我不会发布这样的扭曲代码,因此我根据您的代码和上面的信息创建了一个简单的代码,并将其运行在Valgrind之下,并获得了明确的健康证明。
char (*b)[MAX_SZ] = (char (*)[MAX_SZ])malloc(10 * sizeof(char[MAX_SZ]));
输出无聊(抱歉):
#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;
}