【问题标题】:Why SIZE_OF_STR returns 2 different answers for the same values?为什么 SIZE_OF_STR 为相同的值返回 2 个不同的答案?
【发布时间】:2020-01-14 19:47:38
【问题描述】:

为什么 SIZE_OF_STR 为“hello”字符串返回 7 和 5 值?

#include <stdio.h>
#define SIZE_OF_STR(s) sizeof(s)/sizeof(char)-1
int main()
{
    char *x = "hello";
    printf("%d\n",SIZE_OF_STR(x));
    printf("%d",SIZE_OF_STR("hello"));
    return 0;
}

输出:

7
5

【问题讨论】:

标签: c sizeof strlen


【解决方案1】:

第一个 sizeof 实际上是对一个指向 8 的 char 的指针进行 sizeof。

第二个是对常量字符串的 sizeof 产生 6 表示“hello”。

您的宏表达式实际上在减法之前解决了除法,因此导致 8-1=7 和 6-1=5。

【讨论】:

  • C operator precedence table。除法列在第 3 级,减法列在第 4 级。除法获胜!
  • 为什么这个错误在 strlen 中不可见?
  • @RomanP 正如here 解释的那样,strlen 返回的是“字符串开头和终止空字符之间的字符数(不包括终止空字符)本身)”,因此它计算字符而不是询问变量的大小,这是 sizeof 所做的。如果它解决了您的问题,请接受答案;D
  • 它是最常见的重复之一
  • sizeof 是一个编译时运算符,它告诉您为某事分配了多少内存。 strlen() 是一个运行时函数,实际上是计数字符并停在 0 处。它们完全不相关。
猜你喜欢
  • 2015-06-30
  • 1970-01-01
  • 2017-06-02
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多