【问题标题】:How to find size of char** array如何查找 char** 数组的大小
【发布时间】:2021-06-07 12:12:55
【问题描述】:

如何求char**数组的大小,我一直在做

int getSize(char** args)
{
   int size = (int)sizeof(args)/ (int)sizeof(arg[0]);
   return size;
}

但它只返回值 1。我似乎不知道如何找出我的 char* 数组中有多少元素。

【问题讨论】:

  • 无法检测传递给函数的数组的大小,因为在函数中它不再是数组而是指针。您必须在知道原始数组的调用函数中执行此操作。
  • 这能回答你的问题吗? Knowing the size of the array using pointer
  • 是的,这是有道理的,所以我只需要在创建这个数组时为它设置一个单独的变量,这样我就可以跟踪它的大小;
  • 或者你可以做 strlen 所做的事情,在当前元素不等于 NULL 时继续迭代(如 Andrew Henle 的回答),但是这比仅仅跟踪大小具有更糟糕的时间复杂度.

标签: arrays c pointers char


【解决方案1】:

argv 和环境表(在大多数实现中)使用标准方式:终止 char * 指向带有 NULL 的字符串的指针数组:

Array element   Points to
     0    ->    "string 0"
     1    ->    "string 1"
     2    ->    "string 2"
     .    ->        .
     .    ->        .
     .    ->        .
     N    ->    "string N"
    N+1   ->       NULL

所以你会用类似的东西来计算大小:

int getSize(char** args)
{
    int size = 0;

    while ( args[ size ] )
    {
        size++;
    }

    return( size );
}

【讨论】:

    【解决方案2】:

    在 c 中没有确定数组大小的“好”方法。因此,有很多设计模式要么具有静态大小的数组,要么在末尾放置一些分隔符来表示数组的结束(例如,所有字符串末尾的空字节)。

    因此,根据您的用例,在您想调用getSize 时传递argc 参数可能是有意义的,或者在char** 的末尾存储一个NULL 并迭代数组直到你找到它:

    // snake case is generally standard for c
    int get_size(char** args)
    {
        int i = 0;
    
        // check that the first element of each arg is not ‘\0’
        for ( ; args[i] != NULL; ++i) {
        }
    
        return i;
    }
    

    如果没有这些方法中的任何一种,您可能会遇到访问未分配或已释放内存的问题,并且没有很好的方法来处理这些问题,而且任何尝试都肯定会降低可读性。

    【讨论】:

      【解决方案3】:

      问题在于 args 是一个指针(实际上是一个指向指针的指针),而不是一个数组,所以 sizeof 技巧不起作用 - 你将 char ** 的大小除以char * 的大小和在你的机器上它们是相同的,所以你得到的结果是 1。

      指针值中没有元数据可以告诉您它是指向单个对象还是对象序列中的第一个对象,或者序列中有多少对象 - 这是必须单独跟踪的信息。

      正如 Andrew 指出的那样,在这种情况下,您通常必须依靠哨兵值来标记序列的结束。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-13
        • 1970-01-01
        • 1970-01-01
        • 2018-04-14
        • 2012-06-26
        • 1970-01-01
        • 2014-09-02
        • 1970-01-01
        相关资源
        最近更新 更多