【问题标题】:Result of sizeof differs from size of character string [duplicate]sizeof的结果与字符串的大小不同[重复]
【发布时间】:2019-01-18 11:50:51
【问题描述】:

为什么“Hello World!!”的大小是只显示为 8? 我正在尝试通过 TCP 客户端/服务器程序中的 send() 发送此内容,但无法发送整个字符数组,因为 sizeof 似乎没有正确读取

char *message = "Hello World!!";
int test = sizeof message;
int test2 = sizeof 'H';
printf("%d", test);
printf("%d", test2); 

结果:

(gdb) 打印测试

$1 = 8

(gdb) 打印 test2

$2 = 4

这是我的程序中只发送“Hello Wo”的代码片段

if((numbytes = send(sockfd, message, sizeof message, 0)) == -1){
    perror("recv");
    exit(1);
}

【问题讨论】:

  • sizeof some_pointer 返回 指针 的大小,而不是它可能指向的大小。如果要获取以空字符结尾的字符串的长度,请使用strlen。请注意strlen 包含终止符。
  • sizeof pointer != sizeof array ... sizeof message != sizeof "Hello World!!" 数组不是指针;指针不是数组。我建议您阅读c-faq 的第 6 部分

标签: c linux string pointers


【解决方案1】:

这个:

char *message = "Hello World!!";
int test = sizeof message;

返回 指针 的大小,在您的系统中,指针大小为 8。

Size of pointer of integer type vs Size of int*阅读更多内容。

正如@SomeProgrammerDude 所说,使用strlen() 来获取C 字符串的长度(即以null 结尾的字符串)。

【讨论】:

  • 好吧,我不知道指针的类型无关紧要,这就是为什么我被扔掉了 'H' 的大小并且只得到 4。但我不能使用 strlen() 而不添加char 数组的空终止符,因为它可能导致未定义的行为,对吗? stackoverflow.com/questions/45950202/…
  • 数组"hi"有三个元素,最后一个是'\0'
  • 'H' 的大小是由于整数提升。 'H' 是一个字符,但可以通过任何操作(包括 sizeof())提升为整数。
  • @AlainMerigot: 'H' 是 C 中的 int(我相信 C++ 有不同的规则)。
  • 它不是 NULL,只有 nul 或零终止。 NULL在C中有特殊含义
猜你喜欢
  • 2021-04-21
  • 2023-03-30
  • 1970-01-01
  • 2020-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
相关资源
最近更新 更多