C - > sizeof string总是8

tek*_*agi -1 c string sizeof string-literals

#include "usefunc.h" //don't worry about this -> lib I wrote
int main()
{
  int i;
  string given[4000], longest = "a"; //declared new typdef. equivalent to 2D char array
  given[0] = "a";
  printf("Please enter words separated by RETs...\n");
  for (i = 1; i < 4000 && !StringEqual(given[i-1], "end"); i++)
    {
      given[i] = GetLine();
      /*
      if (sizeof(given[i]) > sizeof(longest))
    {
      longest = given[i];
    }
      */
      printf("%lu\n", sizeof(given[i])); //this ALWAYS RETURNS EIGHT!!!
    }
  printf("%s", longest);
}
Run Code Online (Sandbox Code Playgroud)

它为什么总是返回8 ???

小智 13

stringC中没有数据类型.这是C++吗?或者是stringtypedef?

假设string是一个typedef char *,你可能想要的是strlen,不是sizeof.你得到的8 sizeof实际上是指针的大小(到字符串中的第一个字符).


Mar*_*ett 6

它将它视为一个指针,指针的大小显然是你机器上的8bytes = 64位


Mas*_*ugh 5

这是字符数组本身和指向该数组开始位置的指针之间的常见错误。

例如 C 风格的字符串文字:

char hello[14] = "Hello, World!";
Run Code Online (Sandbox Code Playgroud)

为 14 个字节(13 个字节用于消息,1 个字节用于空终止字符)。您可以使用它sizeof()来确定原始 C 样式字符串的大小。

但是,如果我们创建一个指向该字符串的指针:

char* strptr = hello;
Run Code Online (Sandbox Code Playgroud)

并尝试使用 查找它的大小sizeof(),它只会返回系统上数据指针的大小。

因此,换句话说,当您尝试从字符串库中获取字符串的大小时,您实际上只是获取了指向该字符串开头的指针的大小。您需要使用的是函数strlen(),它返回字符串的字符大小:

sizeof(strptr); //usually 4 or 8 bytes
strlen(strptr); //going to be 14 bytes
Run Code Online (Sandbox Code Playgroud)

希望这能解决问题!