C -> размер строки всегда равен 8 - PullRequest
0 голосов
/ 09 февраля 2011
#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);
}

Почему всегда возвращается 8 ???

Ответы [ 4 ]

13 голосов
/ 09 февраля 2011

Нет типа данных string в C. Это C ++? Или string typedef?

Предполагая, что string является typedef для char *, то, что вы, вероятно, хотите, это strlen, а не sizeof. 8, которое вы получаете с sizeof, на самом деле является размером указателя (на первый символ в строке).

6 голосов
/ 09 февраля 2011

Он обрабатывается как указатель, размер указателя на вашем компьютере, очевидно, составляет 8 байт = 64 бита

4 голосов
/ 09 февраля 2011

Вы говорите: «Не беспокойтесь об этом -> lib, я написал», но это важная часть информации, так как она определяет строку. Предположительно string - это char *, а размер на вашем компьютере - 8. Таким образом, sizeof (учитывая [i]) равен 8, потому что данный [i] является строкой. Возможно, вы хотите strlen, а не sizeof.

3 голосов
/ 13 января 2016

Это распространенная ошибка между самим массивом символов и указателем, где начинается этот массив.

Например, строковый литерал в стиле C:

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

- 14 байтов (13 для сообщения и 1 для нулевого завершающего символа). Вы можете использовать sizeof(), чтобы определить размер необработанной строки в стиле C.

Однако, если мы создадим указатель на эту строку:

char* strptr = hello;

И попытайтесь определить его размер с помощью sizeof(), он всегда будет возвращать только размер указателя данных в вашей системе.

Итак, другими словами, когда вы пытаетесь получить размер строки из библиотеки строк, вы действительно получаете только размер указателя на начало этой строки. Вам нужно использовать функцию strlen(), которая возвращает размер строки в символах:

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

Надеюсь, это прояснит ситуацию!

...