22

在下面的程序中,数组的长度ar在 main 中是正确的,但temp它显示了ar我的计算机上指向的指针的长度为 2(以 为单位sizeof(int))。

#include <stdio.h>

void temp(int ar[]) // this could also be declared as `int *ar`
{
    printf("%d\n", (int) sizeof(ar)/sizeof(int));
}

int main(void)
{
    int ar[]={1,2,3};
    printf("%d\n", (int) sizeof(ar)/sizeof(int));
    temp(ar);
    return 0;
}

我想知道我应该如何定义函数,以便在函数中正确读取数组的长度。

4

7 回答 7

29

没有“内置”方法来确定函数内部的长度。无论您通过什么方式arrsizeof(arr)都将始终返回指针大小。所以最好的方法是将元素的数量作为单独的参数传递。或者,您可以有一个特殊的值,例如0or-1表示结束(就像它\0在字符串中一样,它们只是char [])。但是当然“逻辑”数组大小是sizeof(arr)/sizeof(int) - 1

于 2013-07-11T09:53:11.977 回答
12

不要使用函数,为此使用宏:

//Adapted from K&R, p.135 of edition 2.
#define arrayLength(array) (sizeof((array))/sizeof((array)[0]))

int main(void)
{
    int ar[]={1,2,3};
    printf("%d\n", arrayLength(ar));
    return 0;
}

由于其他人提到的原因,您仍然不能在像您temp将数组作为参数传递的函数中使用此宏。

如果要传递一种数据类型,另一种选择是定义一个同时具有数组和容量的类型:

typedef struct
{
  int *values;
  int capacity;
} intArray;

void temp(intArray array)
{
  printf("%d\n", array.capacity);
}

int main(void)
{
    int ar[]= {1, 2, 3};
    intArray arr;
    arr.values = ar;
    arr.capacity = arrayLength(ar);
    temp(arr);
    return 0;
}

这需要更长的时间来设置,但如果您发现自己在许多函数中传递它,这很有用。

于 2013-07-11T10:04:18.243 回答
11

正如其他人所说,明显的解决方案是将数组的长度作为参数传递,您也可以将此值存储在数组的开头

#include <stdio.h>

void temp(int *ar)
{
    printf("%d\n", ar[-1]);
}

int main(void)
{
    int ar[]= {0, 1, 2, 3};
    ar[0] = sizeof(ar) / sizeof(ar[0]) - 1;
    printf("%d\n", ar[0]);
    temp(ar + 1);
    return 0;
}
于 2013-07-11T10:12:30.943 回答
8

当您编写时size(ar),您传递的是指针不是数组

指针和 int 的大小是 4 或 8 - 取决于ABI(或者,正如@H2CO3 提到的 - 完全不同的东西),所以你得到sizeof(int *)/sizeof int(对于 32 位机器,4/4=1,8/4= 2 对于 64 位机器),这是 1 或 2(或者.. 不同的东西)。

请记住,在 C 中,当将数组作为参数传递给函数时,您传递的是指向数组的指针。
如果要传递数组的大小,则应将其作为单独的参数传递。

于 2013-07-11T10:00:37.540 回答
1

我不认为你可以使用函数来做到这一点。它总是返回指针的长度而不是整个数组的长度。

于 2013-07-11T09:56:34.780 回答
1

您需要将数组包装成一个结构:

#include<stdio.h>

struct foo {int arr[5];};
struct bar {double arr[10];};

void temp(struct foo f, struct bar g)
{
    printf("%d\n",(sizeof f.arr)/(sizeof f.arr[0]));
    printf("%d\n",(sizeof g.arr)/(sizeof g.arr[0]));
}

void main(void)
{
    struct foo tmp1 = {{1,2,3,4,5}};
    struct bar tmp2;
    temp(tmp1,tmp2);

    return;
}
于 2018-03-10T20:43:57.777 回答
0

函数 ar 内部是一个指针,因此 sizeof 运算符将返回指针的长度。计算它的唯一方法是使 ar 全局化或更改其名称。确定长度的最简单方法是 size(array_name)/(size_of(int)。您可以做的另一件事是将此计算传递给函数。

于 2013-07-11T09:52:35.443 回答