开发者

C -> sizeof string is always 8

#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...\开发者_C百科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);
}

Why does it always return 8???


There is no string data type in C. Is this C++? Or is string a typedef?

Assuming string is a typedef for char *, what you probably want is strlen, not sizeof. The 8 that you are getting with sizeof is actually the size of the pointer (to the first character in the string).


It is treating it as a pointer, the sizeof a pointer is obviously 8bytes = 64 bits on your machine


You say "don't worry about this -> lib i wrote" but this is the critical piece of information, as it defines string. Presumably string is char* and the size of that on your machine is 8. Thus, sizeof(given[i]) is 8 because given [i] is a string. Perhaps you want strlen rather than sizeof.


This is common mistake between the array of characters itself, and the pointer to where that array starts.

For instance the C-style string literal:

char hello[14] = "Hello, World!";

Is 14 bytes (13 for the message, and 1 for the null terminating character). You can use sizeof() to determine the size of a raw C-style string.

However, if we create a pointer to that string:

char* strptr = hello;

And attempt to find it's size with sizeof(), it will only always return the size of a data pointer on your system.

So, in other words, when you try to get the size of the string from a string library, you're truly only getting the size of the pointer to the start of that string. What you need to use is the strlen() function, which returns the size of the string in characters:

sizeof(strptr); //usually 4 or 8 bytes
strlen(strptr); //going to be 14 bytes

Hope this clears things up!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜