本期主题:
讲解ARRAY_SIZE的作用以及定义,还有一个踩坑分析
往期链接:
- 数据结构系列——先进先出队列queue
- 数据结构系列——栈 stack
- Linux内核链表
- 零长度数组的使用
- inline的作用
目录
- 1. ARRAY_SIZE定义及作用
- 2.踩坑分析
1. ARRAY_SIZE定义及作用
ARRAY_SIZE
是一个常见的宏定义,用于计算数组的大小(元素数量)。这个宏定义通常用于C和C++语言中,它的定义如下:
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))
ARRAY_SIZE 宏定义的作用是利用 sizeof 运算符来获取数组 arr 的总字节数,然后除以数组中第一个元素的字节数,从而得到数组的元素数量。这样做的原因是在C和C++中,除了动态分配的内存,编译器都能在编译时计算出数组的大小。
使用 ARRAY_SIZE 宏定义时,你只需将数组名作为参数传递给它,它就会返回该数组的元素数量。
看一个具体的例子:
#include "main.h"#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))struct my_str test_str_1[] = {{"a", 1},{"b", 2},{"c", 3},
};struct my_str test_str_2[] = {{"d", 1},{"e", 2},{"f", 3},
};int main(void)
{printf("array1 size is %ld\n", ARRAY_SIZE(test_str_1));printf("array2 size is %ld\n", ARRAY_SIZE(test_str_2));return 0;
}
上述代码会打印结果是 3
2.踩坑分析
想着把上面的代码优化一下,加上一个函数,输入的参数是my_str的指针,从而实现打印size,具体代码实现如下:
void print_size(struct my_str *str)
{printf("print_size, size is %ld\n", ARRAY_SIZE(str));
}int main(void)
{printf("array1 size is %ld\n", ARRAY_SIZE(test_str_1));printf("array2 size is %ld\n", ARRAY_SIZE(test_str_2));print_size(test_str_1);print_size(test_str_2);return 0;
}
最终发现结果是:
$ ./a.out
array1 size is 3
array2 size is 3
print_size, size is 0
print_size, size is 0
后面两个函数输出的size为0是不符合预期的
经过分析后发现:
- 在C语言中,函数的参数传递是通过值传递的方式进行的。当你传递一个指针给函数时,实际上传递的是指针的副本,而不是指针本身指向的内存地址中的内容。
- 因此,在函数中使用了sizeof操作符,它也只是计算了指针的大小,而不是指针所指向的数组的大小。