指向固定大小的数组的指针数组的正确c语法是什么?

时间:2018-11-17 00:56:44

标签: c multidimensional-array syntax casting

我只是想知道下面 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;
}

1 个答案:

答案 0 :(得分:2)

您在以下位置询问“这里发生了什么”

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

您要动态分配指向10个固定大小的数组(char)的数组的指针。

第一个问题是“ =符号的LHS发生了什么”,因为您定义的是bMAX_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;
}