c - 这两个定义对编译器有何不同?

标签 c

以下说法正确的是:

char *c[3] = {"abcd", "efgh", "jklm",};

这虽然在结构上相似,但编译器不喜欢它。

int *a[3] = {{48,49,50,51}, {5,6,7,8}, {9,10,11,12},};

它们有何不同?编译器不能从 a 的初始化中推断出大小吗?

在我看来,编译器对 char * 的处理方式不同。

最佳答案

与 C 字符串文字不同,C 字符串文字会生成一个以 null 结尾的数组,并“衰减”为指针。为了获得与整数相同的功能,您需要使用复合文字。

C编译器将为“abcd”及其空终止符分配内存,并为您提供指针。但是,编译器不会为整数数组 {48,49,50,51} 分配内存,除非您告诉它文字代表整数数组:

int *a[3] = {
    (int[]){48,49,50,51}
,   (int[]){5,6,7,8}
,   (int[]){9,10,11,12}
};

此功能在 C99 及更高版本中可用。如果您使用的是较旧的编译器,并且希望您的 a[] 成为指针数组,则需要单独分配其元素:

static int a0[] = {48,49,50,51};
static int a1[] = {5,6,7,8};
static int a2[] = {9,10,11,12};
int *a[] = {a0, a1, a2};

这可以让你创建一个“锯齿状”数组。如果您不需要锯齿状数组,因为 a[] 中的所有行都具有相同的 4 大小,您可以创建一个常规的 3x4 数组。

关于c - 这两个定义对编译器有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39547179/

相关文章:

c - 嵌套函数被禁用,使用 -fnested-functions 重新启用

计算子进程fork()的进程运行时间

c - 这段代码有什么问题逻辑错误

c - 在我自己实现的 shell 中 waitpid 之后 pid 的状态出现问题

c++ - "Segmentation fault"与 "run time"错误?

c++ - 为什么在大括号初始化中允许在参数列表中使用额外的逗号?

c - 素数查找器,发现比应有的多 6 个素数

c - 通过 I2C 与 ROHM BU94603 通信

c - ftp 客户端/服务器管道损坏错误 C

c 共享内存附加/分离/解除分配