C语言数据结构笔记4:子函数中使用的sizeof 指针无法获取数组的实际大小
在子函数中使用 的sizeof
指针,无法获取数组的实际大小。
C 语言中,当数组作为函数参数传递时,它会退化为指针,导致 sizeof
操作符返回的是指针的大小而非数组的实际大小。
今天记录一下这个小问题。
目录
问题程序:
运行结果与问题解释:
问题程序:
sizeof(Buffer)
返回的是指针的大小,而不是数组的长度。/** 指针退化问题 * */ #include <stdio.h> #include <string.h>void print_buffer_size(unsigned char *buffer) {// 这里 sizeof(buffer) 返回的是指针的大小,而不是数组的大小printf("Size of buffer (pointer): %zu\n", sizeof(buffer)); }int main() {unsigned char test_array[15];// 在这里,sizeof(test_array) 返回的是整个数组的大小(15字节)printf("Size of test_array (actual array): %zu\n", sizeof(test_array));// 将数组传递给函数时,它会退化为指针print_buffer_size(test_array);return 0; }
运行结果与问题解释:
发现前后俩次计算结果不同,一个是数组长度15,但另一个则是8了:
- 指针与数组的区别:
- 在 C 语言中,数组名在大多数情况下会退化为指向其第一个元素的指针。
sizeof
操作符对数组和指针的行为不同:
- 对于数组,
sizeof
返回整个数组的字节大小。- 对于指针,
sizeof
返回指针本身的大小(通常是 4 或 8 字节,取决于系统架构)。- 代码中的问题:
Uart_Buffer
在FuncDeal_send
函数中是一个指针,因此sizeof(Uart_Buffer)
返回的是指针的大小(在你的环境中可能是 8 字节)。- 试图用
sizeof(Uart_Buffer)
来获取缓冲区的长度,这是不正确的。