通常我们会使用下面的代码来求解二维数组的列数、行数和元素个数。
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等函数分配的)并不记录其大小,而且指针本身并没有指示它指向的内存块的大小的方法。在创建动态数组的时候,一定要记得把数组的行数,列数记录下来。