【问题标题】:How to get length of char**?如何获得 char** 的长度?
【发布时间】:2010-04-08 16:09:37
【问题描述】:

快速 c 问题:如何知道 char* foo[] 的长度?

谢谢。

【问题讨论】:

  • char **foochar *foo[] stackoverflow.com/questions/2448204/… 不同
  • 这个问题没有上下文是没有意义的。 char* foo[] 在不同的上下文中可能意味着完全不同的东西。
  • 您的问题需要澄清。询问 char*[] 的长度/大小通常假定答案是数组中 char* 元素的数量。询问 char** 的大小通常假设答案是指针的大小。询问 char* 的长度假定答案是从指针值到第一个 '\x0' 字符的内存大小。 (当然,您实际上可能会问数组中所有字符串消耗的总分配内存:-))那么它是哪一个?
  • 埃文提到,如果它是空终止的,你可以。即使它以其他东西结束,但你知道那是什么,你可以找到长度。否则,并非没有有关它的其他信息。

标签: c arrays


【解决方案1】:

你不能。并非不知道指针内部的内容,或者提前存储该数据。

【讨论】:

  • +1,虽然我想知道这个问题有多少次轮回而不指向许多重复项。
【解决方案2】:

你的意思是数组中的字符串数?

如果数组是在同一块的堆栈中分配的,则可以使用sizeof(foo)/sizeof(foo[0]) 技巧。

const char *foo[] = { "abc", "def" };
const size_t length = sizeof(foo)/sizeof(foo[0]);

如果您谈论的是传递给 main 的 argv,您可以查看 argc 参数。

如果数组是在堆上分配的或传递给一个函数(它会衰减为一个指针),那么除非分配它的人也将大小传递给你,否则你就不走运了。

【讨论】:

    【解决方案3】:

    如果数组是静态分配的,您可以使用sizeof() 函数。所以sizeof(foo)/sizeof(char *) 会起作用。 如果数组是动态创建的,你就有麻烦了!这种数组的长度通常会被显式存储。

    编辑: janks 当然是对的,sizeof 是运营商。

    另外值得指出的是,C99 确实允许sizeof 用于可变大小的数组。然而,不同的编译器实现了 C99 的不同部分,因此需要谨慎。

    【讨论】:

    • sizeof 是一个运算符,而不是一个函数。在表达式上使用 sizeof(而不是类型的名称)甚至不需要大括号。
    猜你喜欢
    • 2014-01-28
    • 2021-09-04
    • 2015-06-08
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多