【问题标题】:How to calculate size of array from pointer variable?如何从指针变量计算数组的大小?
【发布时间】:2012-02-22 07:18:54
【问题描述】:

我有数组指针(内存中的数组)。 我可以从它的指针计算数组的大小吗? 我实际上不知道内存中的数组在哪里。 我只得到指针地址(假设 9001) 使用该地址我必须计算数组大小。

谢谢。

【问题讨论】:

  • 这是要标记为 [C#] 吗?听起来您实际上在使用 [C] 时遇到了问题。
  • 使用 C++ 模板会更容易...
  • 请将此问题标记为[C][C++],但不能同时标记。对于这个问题,适用于一种语言的某些答案不适用于另一种语言。
  • sizeof(array)/sizeof(array[0]) 将为您提供数组中元素的数量。将其乘以 sizeof(array_element_type) 即可得到数组占用的总大小。
  • 您想找到最大尺寸或编号。该数组中的元素数?

标签: c arrays pointers


【解决方案1】:

不,您无法计算数组的大小。 C 中的对象不携带类型信息,因此您必须提前安排知道数组的大小。像这样的:

void my_function(int array[], int size);

【讨论】:

  • 我个人建议不要使用 int array[] 作为函数参数。原则上,它可能会帮助读者,告诉他们array 是指向一个或多个ints 中的第一个的指针。在实践中:(1)size 已经告诉他们; (2) 人们习惯在传递指向字符串第一个字符的指针时使用char*,而不是char[],所以他们也可以应付int*; (3) 不同的语法经常误导新手认为它与int *array 有所不同。
  • 问题越简单,自行车脱落就越大。
  • 是的,你可能是对的。因为在某人对数组(以及指向其第一个元素的指针)如何工作感到困惑/无知的问题中,与您正确答案的纯粹荣耀相比,使人们对数组(以及指向其第一个元素的指针)如何工作感到困惑的东西是微不足道的.
【解决方案2】:

你不能在 C 中做到这一点。指针的大小是指针的大小,而不是它可能指向的任何数组的大小。

如果你最终得到一个指向数组的指针(显式使用 char *pch = "hello"; 之类的东西或隐式使用数组衰减,例如将数组传递给函数),你需要单独保存大小信息,使用类似:

int twisty[] = [3,1,3,1,5,9];
doSomethingWith (twisty, sizeof(twisty)/sizeof(*twisty));
:
void doSomethingWith (int *passages, size_t sz) { ... }

以下代码说明了这一点:

#include <stdio.h>

static void fn (char plugh[], size_t sz) {
    printf ("sizeof(plugh) = %d, sz = %d\n", sizeof(plugh), sz);
}

int main (void) {
    char xyzzy[] = "Pax is a serious bloke!";
    printf ("sizeof(xyzzy) = %d\n", sizeof(xyzzy));
    fn (xyzzy, sizeof(xyzzy)/sizeof(*xyzzy));
    return 0;
}

我系统上的输出是:

sizeof(xyzzy) = 24
sizeof(plugh) = 4, sz = 24

因为24字节的数组在函数调用中衰减为4字节的指针。

【讨论】:

  • fn() 中的sz 不应该是6吗?
  • 不,数组 "Pax is a serious bloke!" 中有 24 个字节。我怀疑你对上面的整数数组感到困惑。
  • 哎呀,对不起,我在想你之前的例子中的xyzzy = [3,1,3,1,5,9]。也许在两个示例中使用相同的 xyzzy 值?
  • 好建议,@liwp,我已更改名称以希望消除任何混淆。
【解决方案3】:

没有。 C 中的数组没有此信息。您应该在包含此数据的数组中保存一个变量“next”。

如果你有自己的数组,你可以在编译阶段使用 sizeof 来获取他的大小。

char array1[XXX];
char* pointer1 = array1;
sizeof(array1); // this is XXX
sizeof(pointer1); // this is the size of a pointer in your system

您应该执行以下操作并在程序中使用该变量(或在将数组传递给函数时将其传递给函数)

int array1size = sizeof(array1);

【讨论】:

    猜你喜欢
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 2010-11-29
    • 2013-12-11
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    相关资源
    最近更新 更多