1

可能重复:
如何找到 sizeof(指向数组的指针)

我知道这是为了找到数组的大小=sizeof(arr)/sizeof(arr[0])

但我必须实现以下(这只是一个演示):

演示.h

#ifndef __DEMO_H
#define __DEMO_H
void heap_sort(int *);
#endif

演示.c

void heap_sort(int *ptrA)
{
//implementing heap sort 
But here it requires length of array 
}

主程序

#include "demo.h"
int main(void)
{
 int A[10];
 heap_sort(A)
 return 0;
}

仅供参考..这只是一个演示..但在这里我必须在其他一些场景中实现它,其中存在“不要更改头文件中的任何内容”的限制,这意味着我无法更改函数签名。那么如何在 For char 中获取数组长度很demo.c容易strlen()得到intfloat double

4

4 回答 4

4

我看到的唯一选择是:

  • 使用特殊值作为终止符(就像strlen那样)。
  • 使用 Pascal 技巧,并将数组长度放在第一个元素中。
  • 将数组大小存储在全局外部变量中。
  • 使用单独的功能。

例如:

int arraySize(int newSize)
{
    static int arraySize = 0;
    int oldSize;
    oldSize = arraySize;
    if (newSize)
        arraySize = newSize;
    return oldSize;
}

main.c

    arraySize(10);

demo.c

    arraylen = arraySize(0);
于 2012-11-12T09:30:06.093 回答
2

如果您不能更改函数签名,那么也许您可以在第一个元素中传递数组的大小。

A[0] = 10;
heap_sort(A);

或者用一些特殊值标记数组的末尾,但我不喜欢这个,因为你必须迭代整个数组才能找到长度,并且你需要确保数组中没有使用这个值:

A[LENGTH-1] = END//some value;

void array_length(A) {
    while (*A++ != END) {
          length++;
    }
}

这只是您施加的限制的解决方案,我通常会做的是将数组的大小作为第二个参数传递,或者将 astruct用于数组:

struct array_t {
    int *data; //allocate this
    int size;
};

注意:其他可怕的解决方案包括全局变量。

于 2012-11-12T09:28:22.190 回答
1

思考的strlen()方向是正确的。

字符串是具有'\0'as 数组终止符的字符数组,作为最后一个元素。

您可以对任何其他类型的数组采用相同的方法。

只需将一个值定义为指示数组中最后一个元素的值。搜索此值可帮助您找到数组的大小。


更新:

我喜欢mux使用数组中第一个元素的想法。

无论如何,使用它来存储其中的元素数量可能会导致问题,以防数组中的元素数量大于可以存储在数组元素中的数量(char例如,一个数组,然后限制为 255 个元素)。

另一方面,我的方法有一个缺点,即用作数组终止符的值不能用作 arra 本身的实际值。

结合前一种和后一种方法,我建议使用数组的第一个元素来存储用作数组终止符的值。

于 2012-11-12T09:31:52.967 回答
0

约束似乎有点奇怪,但无论如何。

为什么不使用全局变量来存储大小。

于 2012-11-12T09:39:12.267 回答