【问题标题】:How to get the size of a const char pointer如何获取 const char 指针的大小
【发布时间】:2017-06-26 23:08:54
【问题描述】:
const char *array[] = {"ax","bo","cf"};

试过了

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

result != 3

还有

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

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

【问题讨论】:

  • 好奇:是什么让你认为 sizeof(const char*) 是 3?根据您的架构,如果它是 32 位,它将返回 4,64 位将返回 8。sizeof(array) 将返回 3*sizeof(pointer)。为什么你认为它应该返回 4?
  • 请注意,限定指针(constvolatile)的大小与非限定指针的大小相同。
  • @JonathanLeffler 当心,在特定平台上,并且取决于(可能是非标准的)编译器,这不可能是真的。 const 限定符可以使指针指向文本 (eprom),因此使用与普通 ram 不同的访问方式,有时使用不同大小的指针。
  • C 标准另有规定。当然,没有控制非标准编译器做什么,但 C 标准说(§6.2.5 类型)¶26 到目前为止提到的任何类型都是非限定类型。每个非限定类型都有其类型的多个限定版本,对应于 constvolatilerestrict 限定符中的一个、两个或所有三个的组合。类型的合格或不合格版本是属于同一类型类别并具有相同表示和对齐要求的不同类型。
  • 上一引文末尾引用的脚注 48 说:相同的表示和对齐要求意味着可互换作为函数的参数、函数的返回值和联合成员。

标签: c arrays pointers sizeof


【解决方案1】:

获取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

【讨论】:

  • 只是出于好奇,哪个更清楚? sizeof array / sizeof array[0]sizeof array / sizeof *array。顺便说一句,我认为第三个例子有错字。应该是 array 而不是 a
  • @RoadRunner 哪个最好sizeof array / sizeof array[0]sizeof array / sizeof *array 很简单。每个小组都应该采用一种编码风格来解决这样的风格问题,然后使用商定的风格。我更喜欢[],因为它强调了对象的数组性质。
  • @RoadRunner 我避免使用sizeof array/sizeof(const char*) 风格,因为它更难编码、审查和维护。要知道类型是否正确,需要与声明进行交叉检查。当类型定义在位于头文件中的某个结构的字段中时,这尤其令人讨厌。
【解决方案2】:
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() ,除非您将参数声明为固定大小的数组。

【讨论】:

  • "sizeof() 在编译时解析" --> sizeof 也适用于可变长度数组,运行时确定。
  • 关于变量数组的好点,还有一个问题是表达式的副作用作为 sizeof 的参数,必须对其进行评估。但这是一种非常糟糕的做法,我想我从未在野外见过它。
【解决方案3】:

你需要先找出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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-05
    • 2021-02-28
    • 2014-08-21
    • 1970-01-01
    • 2016-06-10
    • 2013-06-12
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多