求解二维数组的列数、行数和元素个数时,静态数组和动态数组有区别

  通常我们会使用下面的代码来求解二维数组的列数、行数和元素个数。

int num = sizeof(arr) / sizeof(arr [0][0]);//求数组元素总个数

int col = sizeof(arr [0]) / sizeof(arr [0][0]);//求二维数组的列数

int line = num / col;//求二维数组的行数

一:静态数组

#include<stdio.h>
int main()
{
	int matrix[2][3] = { 1,2,3,
						 4,5,6};

	int num = sizeof(matrix) / sizeof(matrix[0][0]);//求数组元素总个数

	int col = sizeof(matrix[0]) / sizeof(matrix[0][0]);//求二维数组的列数

	int line = num / col;//求二维数组的行数

	printf("二维数组matrix的元素个数=%d\n", num);
	printf("二维数组matrix的列数=%d\n", col);
	printf("二维数组matrix的行数=%d", line);
	return 0;

}

运行结果毫无疑问是对的

二维数组matrix的元素个数=6
二维数组matrix的列数=3
二维数组matrix的行数=2

毫无疑问,如果 matrix 静态数组,那么 sizeof(matrix) 将返回指数组所占用的实际内存大小

二:动态数组

#include<stdio.h>
#include<stdlib.h>
int** CreateGrid(int m, int n)
{
    int** matrix = NULL;
    matrix = (int**)calloc(m, sizeof(int*));
    if (matrix == NULL)
    {
        perror("malloc failed!");
        exit(EXIT_FAILURE);
    }
    for (int i = 0; i < m; i++)
    {
        matrix[i] = (int*)calloc(n, sizeof(int));
        if (matrix[i] == NULL)
        {
            perror("malloc failed!");
            exit(EXIT_FAILURE);
        }
    }
    return matrix;
}
int main()
{ 
    int m = 2, n = 3;
    int** matrix = CreateGrid(m,n);//创建一个m,n的动态数组
    printf("matrix数组:\n");
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
    printf("\n");
	int num = sizeof(matrix) / sizeof(matrix[0][0]);//求数组元素总个数

	int col = sizeof(matrix[0]) / sizeof(matrix[0][0]);//求二维数组的列数

	int line = num / col;//求二维数组的行数

	printf("二维数组matrix的元素个数=%d\n", num);
	printf("二维数组matrix的列数=%d\n", col);
	printf("二维数组matrix的行数=%d\n", line);
	return 0;

}

运行结果是错误的!

matrix数组:
0 0 0
0 0 0

二维数组matrix的元素个数=2
二维数组matrix的列数=2
二维数组matrix的行数=1

原因:在C语言中,sizeof 运算符返回的是对象或类型的字节大小。对于一个动态分配的数组,通常会使用指针来引用它。然而,sizeof 对于指针的结果是固定的,通常是4字节或8字节,具体取决于系统的位数(32位系统通常是4字节,64位系统通常是8字节)。如果 arr 是一个指向动态数组的指针,那么 sizeof(arr) 将返回指针本身的大小,而不是动态数组所占用的实际内存大小

sizeof(matrix)=8

确切地说,如果只知道动态数组的起始地址,而没有其他信息,通常是无法直接确定数组的大小的。在C语言中,动态分配的内存块(通过malloc、calloc等函数分配的)并不记录其大小,而且指针本身并没有指示它指向的内存块的大小的方法。在创建动态数组的时候,一定要记得把数组的行数,列数记录下来。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值