如何获取 const char 指针的大小

6
const char *array[] = {"ax","bo","cf"};

尝试过

printf("size of array = %lu\n", sizeof(const char*));

result != 3

also

printf("size of array = %lu\n", sizeof(array));
result != **DESIRED ANSWER** = 4

注意...我在这里阅读了相关的问题,但没有一个问题与我的问题有关......


请注意:本次翻译涉及IT技术领域,如需更深入的理解,请参考相关专业术语或咨询专业人员。


1
好奇:你为什么认为sizeof(const char*)是3呢?根据你的架构,如果是32位系统则返回4,64位系统则返回8。sizeof(array)将返回3倍sizeof(pointer)。你为什么认为它应该返回4呢? - cup
1
请注意,限定符指针(constvolatile)的大小与非限定符指针的大小相同。 - Jonathan Leffler
@JonathanLeffler 注意,在特定平台上,根据(可能非标准的)编译器,这可能不是真的。const 限定符可以使指针指向文本(EPROM),因此使用与正常 RAM 不同的访问方式,有时指针的大小也不同。 - linuxfan says Reinstate Monica
1
C标准有所不同。当然,无法控制非标准编译器的行为,但是C标准(§6.2.5类型)_¶26指出:任何已提到的类型都是未经限定的类型。每种未经限定的类型都有其类型的多个限定版本,对应于constvolatilerestrict限定符的一个、两个或全部三个组合。类型的限定或未限定版本是属于同一类型类别并具有相同表示和对齐要求的不同类型。 - Jonathan Leffler
1
在上述引用的末尾提到的脚注48指出:相同的表示和对齐要求意味着作为函数参数、函数返回值和联合成员的可互换性。 - Jonathan Leffler
3个回答

10
获取一个const char指针的大小:
printf("%zu\n", sizeof(const char *));

为了获取数组 array[] 的大小:
const char *array[] = {"ax","bo","cf"};
printf("%zu\n", sizeof array);

要获取数组array[]中元素的数量,请将数组的大小除以一个数组元素的大小。

const char *array[] = {"ax","bo","cf"};
// Size of array/size of array element
printf("%zu\n", sizeof array / sizeof array[0]); 
// expect 3

1
只是出于好奇,哪个更清晰?sizeof array / sizeof array[0]还是sizeof array / sizeof *array。顺便说一句,我认为第三个例子有错别字。应该是array而不是a - RoadRunner
@RoadRunner,哪个更好sizeof array / sizeof array[0]还是sizeof array / sizeof *array很容易。每个团队都应该采用一个解决这类问题的编码风格,然后使用达成一致的那个。我更喜欢[],因为它强调了对象的数组性质。 - chux - Reinstate Monica
@RoadRunner 我避免使用sizeof array/sizeof(const char*)的风格,因为这样更难编写、审查和维护。要知道类型是否正确需要与声明进行交叉检查。当类型在位于头文件中的某个结构体字段中定义时,这尤其麻烦。 - chux - Reinstate Monica

3
anyType array[3] = {};    

sizeof(array[0]) //will return the size of one element of any array

sizeof(array) //will return the storage requirement of the entire array

(sizeof(array)/sizeof(array[0])) //will return the number of elements in the array

但是要记住,sizeof()在编译时解析,因此仅在您拥有实际的数组变量而非元素指针时才有效。这意味着您无法将数组传递到函数中,然后对传递的参数使用sizeof(),除非您声明参数为固定大小的数组。


1
sizeof 也适用于可变长度数组,是在运行时确定的。 - chux - Reinstate Monica
变量数组的优点很好,还有一个问题是将具有副作用的表达式作为sizeof的参数进行评估。但这是如此糟糕的做法,我认为我从未在实际中见过它。 - bd2357

1

首先,您需要找出const char *的大小,然后将其除以数组的大小,如下所示:

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

int main()
{
    const char *array[] = {"ax","bo","cf"};
    printf("%d",sizeof(array)/sizeof(const char*));
    return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接