gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:23:44 24 4
gpt4 key购买 nike

以下说法正确的是:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com