【问题标题】:How to use sizeof in the void function for determine size of 2d matrix? [duplicate]如何在 void 函数中使用 sizeof 来确定二维矩阵的大小? [复制]
【发布时间】:2020-05-10 12:53:53
【问题描述】:
#include<stdio.h>   
#include<stdlib.h>
#include<string.h>

void find_col_num(int matrix[][5])
{
    printf("size of matrix = %d\n",sizeof(matrix));
    printf("size of one element = %d\n", sizeof(matrix[0][0]));
    printf("number of columns = %d\n", sizeof(matrix)/(sizeof(matrix[0][0])*5));
}

int main()
{
    int a[6][5] = { {0,0,0,0,0},
                    {0,1,1,1,1},
                    {1,0,1,0,0},
                    {1,0,1,0,0},
                    {1,0,1,0,0},
                    {0,1,1,1,1} };

    find_col_num(a);

    printf("\n\n\n");

    printf("size of a = %d\n",sizeof(a));
    printf("size of one element = %d\n", sizeof(a[0][0]));
    printf("number of columns = %d\n", sizeof(a)/(sizeof(a[0][0])*5));

    return 0;
}

输出:

size of matrix = 8
size of one element = 4
number of columns = 0



size of a = 120
size of one element = 4
number of columns = 6

我想在 void 或 int 函数中使用sizeof 来确定矩阵的列数。我知道我必须在函数中指定矩阵的行数。我该如何处理?

【问题讨论】:

  • 函数find_col_num无法知道其参数的大小。除非它是全球已知的,否则您必须将其作为另一个参数传递。事实上,它可以是任何大小,只要您不超出数组边界。没有给出外部尺寸的尺寸,即使有,也不是限制性的。给出一维的唯一原因是编译器知道如何索引二维数组。
  • 好吧...我该如何处理呢?对不起,我是 C 的新人。
  • 传递给函数的数组衰减为指针,这是编译器知道的。如果它是一个足够信息的一维数组。这是一个二维数组,因此编译器需要知道每行的宽度。这就是为什么给出内部维度。请注意,对于一维数组,即使您声明了维度,编译器也会忽略它。同样,这里的二维数组也没有外维度,因为数组的大小是无限的。
  • 您必须将外部维度中的元素数量传递给函数。顺便说一句,您知道数组的大小,因为您是定义它的人。假设您使用malloc 分配内存。人们在这里问“内存的大小是多少?”唯一可能的答案是“你告诉它分配的大小”。
  • 好吧..如何在void函数中再次分配内存?

标签: c arrays function sizeof


【解决方案1】:

参数int matrix[][5] 在传递给函数时,衰减指向int 的指针。这就是它的大小为 8(系统中指针的大小)的原因。

因此,计算出的列数不是您所期望的。

如果不更改find_col_num ()签名,恐怕没有机会获得你想要的东西。最好的方法可能是将矩阵的总大小传递给函数:

void find_col_num(int matrix[][5], size_t tot_size)
{
    /* ... */
}

你可以这样称呼它

find_col_num(a, sizeof(a));

【讨论】:

  • 谢谢 :D 为什么我没有想到这一点
  • @ÖmerFarukVERGİSİZ 欢迎您。大多数解决方案看起来都是微不足道的......在你了解它们之后。
  • 对不起,现在我意识到我不能使用这个解决方案,因为我在另一个函数中使用了 find_col_num,所以我不能使用 sizeof 那里也是。
  • @ÖmerFarukVERGİSİZ 恐怕您也必须更改其他功能..
  • 如果你有时间,你能看看我的代码吗?如果你不想看,我会理解的。
猜你喜欢
  • 2020-04-10
  • 2013-07-24
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 2017-02-17
  • 2010-12-30
相关资源
最近更新 更多