如何查找指针数组指向的元素大小?

时间:2014-12-21 13:35:38

标签: c string pointers

这是代码,

char const *words[] ={
        "Hello",
        "What are you doing",
        0
    };
    int size = sizeof(words[1]), totalSize = sizeof(words);

totalSize的值为24size的值为8。我使用gdb获得运行时外观,因为命令p words[1]结果为$1 = 0x40400f "What are you doing"所以words[1]被调试器视为数组,仍然sizeof()将其视为指针。我不明白为什么会这样。

6 个答案:

答案 0 :(得分:2)

words是指向(constchar的3个指针的数组。

所以带有数组操作数的sizeof将产生3个指针的累积大小,而数组元素的sizeof将产生一个指针的大小。

答案 1 :(得分:2)

调试器向您显示指向字符串的内容这一事实并不意味着编译器将其称为静态分配的数组sizeof运算符可以是应用“正确”)。

您可以使用以下代码检索这些尺寸(不包括空字符):

int size = strlen(words[1]);
int totalSize = 0;
for (int i=0; words[i]!=0; i++)
    totalSize += strlen(words[i]);

您也可以摆脱words数组中的最后一个元素,并改为使用它:

int size = strlen(words[1]);
int totalSize = 0;
for (int i=0; sizeof(words)/sizeof(*words); i++)
    totalSize += strlen(words[i]);

答案 2 :(得分:1)

words是一个char指针数组。因此,它的元素是指向char 的类型。 words[1]是指向char的类型的指针,而不是char的数组,这就是为什么你得到指针大小而不是指向它的字符串大小的原因。

  

如何查找指针数组指向的元素大小?

为了找到指针所指向的字符串的大小,您需要遍历它。

int size = 0;
char const *ptr = words[1];
while(ptr++) 
    size++;  

或使用标准库函数strlen

size_t size = strlen(words[1]);

答案 3 :(得分:1)

这是因为sizeof()运营商正被result at compile time取代。如果在循环中使用它,它应该为所有sizeof(words[i])提供相同的结果,对于sizeof(words[1])也是如此。因此编译器将其简单地解释为(64位)指针。

答案 4 :(得分:1)

您声明了数组words,如

char const *words[]; 

这意味着数组的每个元素都具有类型char const *,而sizeof( words[0] )等同于sizeof( char const * ),在您的环境中等于8个字节。 如果您想知道指针words[0]指向的字符串文字的长度,那么您应该使用标头strlen中声明的标准C函数<string.h>。例如

size_t length = strlen( words[0] );

考虑到尽管数组中的所有指针都具有相同的大小,但是这些指针指向的字符串文字大小为8字节。

这是一个示范程序

#include <stdio.h>
#include <string.h>

int main(void) 
{
    char const *words[] =
    {
        "Hello",
        "What are you doing",
        0
    };

    const char **p = words;

    for ( ; *p; ++p ) printf( "\"%s\": %zu\n", *p, strlen( *p ) );

    return 0;
}

输出

"Hello": 5
"What are you doing": 18

字符串文字本身在C中具有相应的

类型

char [6]char[19]因为它们包含终止零。

答案 5 :(得分:0)

初始框显示字符串的基址。

+----+    +-----+
|1000|--->|Hello|
+----+    +-----+
words[0]

+----+    +------------------+
|2000|--->|What are you doing|
+----+    +------------------+
words[1]

如果你执行sizeof(words[0]),它是char const*类型的指针,我们都知道指针的大小通常对于所有数据类型都是相同的{{ 1}},但在你的情况下它是64位机器,因此你得到4作为输出。

出于同样的原因,即使8也会抓取sizeof(words[1])

使用指向指针概念的指针来获取该基址的单词。