c - 查找数组大小时出错

标签 c arrays sizeof

我正在尝试计算 C 中数组的大小。

我的第一个实现是基于 this question 已接受的答案:

int size = sizeof(arr)/sizeof(arr[0]);

但这总是给了我一个。我尝试这样做:

int size = sizeof(arr);

无论数组的大小如何,这每次都会给我 4。

这是我使用的代码的最小示例。

void findSize(int arr[]) {
    int size = sizeof(arr);
    printf("%d\n",size);
}

int main(int argc, char** argv) {
    int arr[] = {4,6,9,2,6,3,7,2,5,1,2};
    findSize(arr);
}

无论我使用什么数组,此代码始终打印 4。

为什么打印 4,如何找到数组的实际大小?

最佳答案

您的:

void findSize(int arr[]) {

相当于:

void findSize(int arr[3424]) {

这与:

相同
void findSize(int *arr) {

因此 findSize 中的 sizeof(arr) 计算指针的大小。

在 C99 中,您可以执行此操作 ( read more about it here ):

void findSize(int n, int arr[n]) {

但即使在这种情况下,sizeof(arr)也会返回指针的大小。

为什么?因为数组变量会自动衰减为指向其第一个元素的指针。

更新:C99 中的参数错误,sizeof 仅适用于函数体中声明的可变长度数组。感谢@rslemos。下标可以正确地推进嵌套数组的指针, see example .

关于c - 查找数组大小时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24538641/

相关文章:

c - C语言头文件的编写方法

c - libc.so mmap strace

c - C/C++ 的简写和快捷方式

javascript - 将 Javascript 对象数组中的名称/值应用到 HTML 列表

php - POST 变量数组和 filter_input

c - 如果 sizeof(long) 在我的机器上是 4 个字节,我可以推断 sizeof(long long) 将是 8 个字节吗?

c - 冒泡排序方法不适用于 C 中的链表

javascript - 如何跨多个 Controller 过滤和同步对象数组

c - C 中二维数组的大小

c - sizeof(2147483648) 是 8 个字节,而 sizeof(2147483647+1) 是 4 个字节