【问题标题】:Char size and const void* [duplicate]字符大小和 const void* [重复]
【发布时间】:2014-07-09 15:36:11
【问题描述】:

我对 const void* 中的数据大小有疑问。在下面的代码中,第一个 printf 的输出是 6,而第二个 printf 的输出是 3。请帮忙,我找不到问题出在哪里。提前谢谢你

#define TEST "\x00\x01\x02\x03\x04\x05"

#include <stdio.h>

static void function(const void* c);

int main (void) {

    printf("TEST: %d\n",sizeof(TEST) -1);
    function(TEST);

    return 0;
}

static void function(const void* c) {
    printf("TEST: %d\n",sizeof(c) -1);
}

【问题讨论】:

    标签: c++ c


    【解决方案1】:

    在第一种情况下,sizeof(TEST) 是字符串字面量的大小,它是一个足够大的数组,可以包含所有字符加上终止符 - 在本例中为 7 个字节。

    在第二种情况下,sizeof(c) 是指针的大小 - 4 字节,在您的 32 位平台上。

    一般来说,仅给定一个指向数组的指针,就无法判断数组的大小。如果它指向一个 C 风格的终止字符串,您可以使用 strlen(c) 测量长度。但是,在这种情况下,它包含一个空字符,因此无法确定长度。

    在 C++ 中,您可以使用模板而不是 sizeof 来获取数组的大小:

    template<typename T, size_t N> size_t array_size(T(&)[N]) {return N;}
    

    这样做的好处是,如果您不小心将其应用于指针而不是数组,您将得到编译时错误,而不是意外的运行时结果。

    【讨论】:

    • 我尝试使用 strlen(c) 但尺寸为 0。您能否提供更多详细信息。谢谢!
    • @user3821117:您的字符串以空字符开头,因此它的长度似乎为零。由于它不是有效的 C 样式字符串,因此无法找到长度。
    【解决方案2】:

    sizeof 运算符返回与sizeof(char) 相关的类型名称或表达式的字节数。语法如下:

    sizeof unary-expression 
    sizeof ( type-name ) 
    

    如果它是一个一元表达式并且它是一个字符串文字,就像你 sizeof(TEST) 一样,它会返回这个字符串中的字节数,包括空字节终止符。但是,如果它是像2*p 这样的表达式,其结果类型为int,则表达式在编译时进行评估(没有任何副作用)并返回结果类型(int)的大小,如@987654329 @

    或者,如果它是 type-name,就像在您的 sizeof(c) 中一样,它会返回与平台无关的这种类型的字节数。例如,sizeof(int) 在 32 位机器上是 4 字节。

    【讨论】:

    • sizeof 返回chars 的大小
    • @clcto, sizeof 始终以字节为单位。 char 是一个字节。
    • @chris no sizeof(char) 定义为 1,而 char 中的字节数由实现定义
    • @clcto:你什么意思?在 C 和 C++ 中,根据定义,char 是一个字节。
    • @clcto: “所以一个字节没有定义为 8 位?”不。一个字节被定义为最小的可寻址对象,具有CHAR_BIT 位。在大多数流行平台上它是 8 位,但有些平台(例如 DSP 和老式大型机)具有不同大小的字节。 (我曾经不得不在一个 24 位字节的平台上编写字符串处理函数,如果你正在寻找乐趣,我不建议这样做。)
    猜你喜欢
    • 2020-09-16
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 2021-08-12
    • 2017-08-30
    • 2013-11-11
    • 1970-01-01
    • 2021-11-23
    相关资源
    最近更新 更多