gpt4 book ai didi

c - 指向整数数组的指针的标量初始值设定项的多余元素

转载 作者:太空狗 更新时间:2023-10-29 16:23:50 24 4
gpt4 key购买 nike

我正在 K&R 中做一个练习(例如 5–9),我试图将原始程序的二维数组转换为

static char daytab[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};

使用指向 13 个整数数组的指针,例如

static char (*daytab)[13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};

但是编译器打印出警告:标量初始值设定项中的多余元素

在将数组传递给函数时,谷歌搜索没有帮助,甚至 K&R 也写道,

myFunction(int daytab[2][13]) {...}

相同
myFunction(int (*daytab)[13]) {...}

最佳答案

两者只是部分等价。不同之处在于:

static char daytab[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};

声明一个二维数组,其中包括为数组留出空间并确保 daytab 引用该内存。然而:

static char (*daytab)[13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};

...只声明一个指针。所以你试图用数组初始化器初始化一个指针,但它没有按预期工作。没有数组;没有为数组预留内存。相反,您的初始化程序中的第一个数字被分配给指针 daytab,并且编译器会生成一个警告,让您知道您指定了很多额外的值,这些值只是被丢弃了。由于初始化程序中的第一个数字是 0,因此您只是以相当冗长的方式将 daytab 设置为 NULL

因此,如果您想进行此类初始化,请使用第一个版本——它会退化为您在第二个版本中明确声明的相同指针类型,因此您可以以相同的方式使用它。当您希望动态分配数组或获取对另一个已存在数组的引用时,需要使用带有数组指针的第二个版本。

所以你可以这样做:

static char arr[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };
static char (*ptr)[3] = NULL;

ptr = arr;

...然后交替使用ptrarr。或者这样:

static char (*ptr)[3] = NULL;

ptr = malloc(2 * sizeof(*ptr));

...获取动态分配的二维数组(不是指向一维数组的指针数组,而是真正的二维数组)。当然,在那种情况下它没有被初始化。

这两个变体的“等价性”仅仅意味着二维数组,当它衰减到指向其第一个元素的指针时,衰减到第二个变体中声明的指针类型。一旦指针版本实际指向一个数组,两者就等价了。但是二维数组版本为数组设置了内存,其中指针声明没有...并且可以为指针分配一个新值(指向不同的数组),而二维数组变量不能。

不过在 C99 中你可以这样做(如果不是 static 至少):

char (*daytab)[13] = (char [][13]){
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};

关于c - 指向整数数组的指针的标量初始值设定项的多余元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8108416/

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