gpt4 book ai didi

c - C中多维数组的内部数组的元素数

转载 作者:太空宇宙 更新时间:2023-11-04 04:16:47 24 4
gpt4 key购买 nike

我是 C 的新手,通过在线阅读我了解到使用 sizeof() 我可以拥有以字节为单位分配给它的内存,如果我将它除以其中的元素或数据类型,我可以拥有数组元素的数量。

我正在尝试将此逻辑与二维多维数组一起使用,但我在使用内部数组时遇到了问题。

这是一个代码示例:

#include <stdio.h>

#define ARRAYLEN(arr) (sizeof(arr) / sizeof(arr[0]))

int main(void) {
int input[][20] = {
{90, 1349, 430, 198, 677, 1869, 1692, 1098, 761, 677, 1004 ,0},
{163, 642 ,2445, 1032, 2738 ,1591 ,3950 ,1600 ,651, 0},
{1730 ,3067 ,1956, 723 ,1307 ,417 ,2838 ,1486 ,3114 ,3698 ,1881 ,0},
{2337, 5131 ,1527 ,5042 ,953, 0},
{80, 389, 413 ,209 ,219, 100 ,191, 419, 181 ,473 ,271 ,0},
{22 ,3900 ,4057, 439 ,2642, 1447 ,3553, 2244, 3328, 3924, 1486, 400, 2394 ,0},
{2870, 621 ,3779, 3508, 3729, 2985, 1083, 1384, 3782 ,2606, 637, 0},
{1400, 108 ,472 ,1411, 10, 453, 1631, 1331, 0},
{808 ,1584, 2545, 2294, 1983, 842 ,447, 807 ,3711, 1067, 490, 0},
{435 ,14 ,261, 395, 340, 340, 25, 114, 178 ,52 ,232 ,19, 54, 0},
{6181 ,2026, 4061, 7796 ,5192 ,958, 4190, 965 ,2642, 5082, 2579, 1872 ,0},
{2030, 106, 579, 36, 1147 ,111 ,1393 ,459, 209, 1847, 1171, 415, 725, 1245, 0}
};

printf("%d", ARRAYLEN(input));
printf(" ");
printf("%d", ARRAYLEN(input[0]));

printf(" ");
printf("%d", sizeof(input[0]) / sizeof(int));

return 0;
}

第一个 printf() 返回 12 这是正确的,但是第二个 printf() (和第三个)返回 20 这是我分配给它的内存,但不是每个元素的元素数量,这是我要寻找的以便在 for 循环中使用的内容。

有人可以解释一下我该怎么做吗?或者我做错了什么?

我在任何地方都找不到答案/解释。

提前致谢

最佳答案

您的程序在 sizeof(size_t) != sizeof(int) 的架构上有潜在的未定义行为。在您的 printf 格式字符串中使用 %zu 或将参数转换为 (int)

您还应该更加小心地将 ARRAYLEN 宏参数括起来。

修改后的版本:

#include <stdio.h>

#define ARRAYLEN(arr) (sizeof(arr) / sizeof((arr)[0]))

int main(void) {
int input[][20] = {
{90, 1349, 430, 198, 677, 1869, 1692, 1098, 761, 677, 1004 ,0},
{163, 642 ,2445, 1032, 2738 ,1591 ,3950 ,1600 ,651, 0},
{1730 ,3067 ,1956, 723 ,1307 ,417 ,2838 ,1486 ,3114 ,3698 ,1881 ,0},
{2337, 5131 ,1527 ,5042 ,953, 0},
{80, 389, 413 ,209 ,219, 100 ,191, 419, 181 ,473 ,271 ,0},
{22 ,3900 ,4057, 439 ,2642, 1447 ,3553, 2244, 3328, 3924, 1486, 400, 2394 ,0},
{2870, 621 ,3779, 3508, 3729, 2985, 1083, 1384, 3782 ,2606, 637, 0},
{1400, 108 ,472 ,1411, 10, 453, 1631, 1331, 0},
{808 ,1584, 2545, 2294, 1983, 842 ,447, 807 ,3711, 1067, 490, 0},
{435 ,14 ,261, 395, 340, 340, 25, 114, 178 ,52 ,232 ,19, 54, 0},
{6181 ,2026, 4061, 7796 ,5192 ,958, 4190, 965 ,2642, 5082, 2579, 1872 ,0},
{2030, 106, 579, 36, 1147 ,111 ,1393 ,459, 209, 1847, 1171, 415, 725, 1245, 0}
};

printf("%d %d %d\n",
(int)ARRAYLEN(input),
(int)ARRAYLEN(input[0]),
(int)(sizeof(input[0]) / sizeof(int)));

return 0;
}

输出为 12 20 20,如预期:

  • 12是数组input的元素个数:12行20个int
  • 20 是数组 input[0] 中元素的数量,根据定义。
  • 20 也是数组 input[0] 中元素的数量,因为 int 是其元素的类型。

部分或全部子数组的初始值设定项中的元素较少这一事实不会改变它们的大小,每个子数组都有 20 个元素,如定义 int input[][20] 中所指定,其余元素初始化为0。子数组的数量由编译器根据初始化程序确定。

关于c - C中多维数组的内部数组的元素数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51116094/

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