在C语言中,指针和数组相关,但并不相同:
在将数组传递给函数时,实际上传递的是指向数组第一个元素的指针(因此在函数内部使用sizeof不返回整个数组的大小,而仅返回指针的大小)。
传递的语法:
void foo(int arr[], int size) { // arr 实际上是 int* for (int i = 0; i < size; ++i) printf("%d ", arr[i]); } int main() { int data[5] = {1,2,3,4,5}; foo(data, 5); }
问题: 如果arr是类型为int arr[]的参数,那么在函数内部,表达式sizeof(arr)会返回什么?
答案: 返回指针的大小(sizeof(int*)),而不是整个数组的大小。因为传递给函数的是指向第一个元素的指针,关于长度的信息丢失了。
void printSize(int arr[]) { printf("%zu ", sizeof(arr)); // sizeof(int*) 通常是4或8 }
历史
在一个商业项目中,为了计算数组的平均值,编写的代码在函数内部使用sizeof(arr) / sizeof(arr[0])来计算元素数量,结果总是返回1或2,而不是实际的元素数量。这导致程序在处理数据时不正确,平均值计算错误。
历史
在一个项目中,动态分配的数组在没有单独存储长度(size)的情况下被传递给函数。结果函数不知道分配了多少个元素,导致越界、内存泄漏或损坏。
历史
错误地将固定大小的数组用作指针,在一些编译器中允许通过memcpy直接分配整个数组而不是它的元素。这导致出现不明显的错误,使得数据结构的部分丢失或栈溢出。