是否可以在不传递参数的情况下找到函数中的数组长度? [重复]

问题描述 投票:-3回答:3

有没有一种方法可以获取函数内部数组的长度?我需要找到一个数组的大小,但是它是在主函数中定义的,由于无法更改主函数,因此无法将数组大小作为参数传递。有什么办法可以通过函数找到它吗?

数组的最大大小设置为大约100,但是实际输入将在大小1到20之间。因此,我也不能真正采用最大大小方法。

c arrays c11
3个回答
-5
投票

您可以在for循环中添加一个计数器,以查看下一行之前有多少个变量。

int counter(int array[100]) {
    int counter = -1;
    for (i = 0; array != '\0'; i++) {
        counter = counter + 1;
    }
    return counter;
}

然后在主要部分

int arraysize = counter();

2
投票

否,数组always传递给函数时会衰减到指针,因此如果您想让函数知道大小,则必须传递长度。使用一些前提条件,您可以通过多种方式来执行此操作而无需附加参数:

  • 最后添加一个null /零/任何特殊参数,类似于以null终止的char数组。仅当您确实知道有一个唯一值从未出现在值列表中才能放在最终位置时,才有可能。实际上,此方法在Linux系统调用中非常常见,例如exec family

    exec
  • 在开头添加长度前缀

    char *args[] = { "Hello", "C", "Programming", NULL /* ends the array */ };
    execv("./hello", args);
    

    Pascal也使用void my_function(int array[]) { int length = array[0]; int* data = &array[1]; // operate on data[]; } int my_data[LENGTH + 1] = { LENGTH, /* values */ }; my_function(my_data); ,因此其字符串仅限于255个字符,且长度为1字节。但这可以通过使用更大的长度来解决

    其变化形式是length-prefixed string,其中指针指向实际数据而不是结构的开始

    BSTR in Windows

1
投票

例如,如果声明了函数,例如

BSTR

其中T是某种类型说明符,然后该函数处理一个指向类型T的指针。也就是说,上面的声明等同于下面的声明

typedef struct MY_ARRAY
{
    int32_t length;
    my_type* data;  // array of the desired type
} my_array;

void my_function(my_type array[])
{
    int length;
    memcpy(&length, (char*)array - sizeof(int32_t), sizeof(int32_t));
    // operate on array[];
}

my_type data_list[] = { /* some data */ };
my_array my_data = { LENGTH, data_list };
my_function(my_data.data);

并且两者都声明相同的一个功能。

因此,计算指针所指向的数组中实际元素数量的唯一方法是引入一个与数组的实际元素值不同的哨兵值。

例如,当字符数组包含字符串时,字符数组可以具有诸如'\ 0'之类的前哨值。

字符串数组可以将空字符串“”或作为声明的方式(例如,作为元素类型为char *的数组)作为定点值,定点值可以为NULL。

对于整数数组,您可以自己选择一个适当的值作为前哨值。例如,如果实际元素为非负数,则可以将前哨值设置为-1。

© www.soinside.com 2019 - 2024. All rights reserved.