Подтвердить что ты не робот

Sizeof для нулевого конца const char *

const char* a;

как я могу убедиться, что строка 'a' завершена нулем? когда a = "abcd", и я делаю sizeof (a), я получаю 4. Означает ли это, что это не завершено нулем? если бы это было так, я бы получил 5?

4b9b3361

Ответ 1

Если вам передан массив char, который может содержать или не иметь нулевые данные в нем, действительно нет хорошего способа проверить. Лучшее, что вы можете сделать, это поиск нулевого символа до заданной длины certian (не бесконечно!). Но 0 - не совсем необычный байт данных для поиска в неинициализированной области памяти.

Это одна из многих вещей о стандарте строки C defacto, который многим не нравится. Нахождение длины строки, с которой клиент сталкивается, в лучшем случае является операцией поиска O (n) и худшей ошибкой сегментации.

Еще одна проблема, конечно, в том, что массивы и указатели взаимозаменяемы. Это означает, что array_name + 2 совпадает с &(array_name[2]), а sizeof(a) - sizeof(char*), а не длина массива.

Ответ 2

sizeof(a) дает размер указателя, а не массив символов, на которые указывает указатель. Это так же, как если бы вы сказали sizeof(char*).

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

char a[] = "abcd";
size_t sizeof_a = sizeof(a); // sizeof_a is 5, because 'a' is an array not a pointer

Строковый литерал "abcd" имеет нулевое завершение; все строковые литералы имеют нулевое завершение.

Ответ 3

Вы получаете 4, потому что это размер указателя на вашей системе. Если вы хотите получить длину строки с нулевым завершением, вам нужна функция strlen в стандартной библиотеке C.

Ответ 4

Проблема заключается в том, что вы путаете sizeof(), который является операцией времени компиляции с длиной строки, которая является операцией выполнения. Причина возврата 4 при запуске sizeof(a) заключается в том, что a является указателем, а типичный размер указателя в C - 4 байта. Чтобы получить длину строки, используйте strlen.

Во втором вопросе, как убедиться, что строка завершена нулем. Единственный способ окончательно сделать это - обнулить конец строки. Учитывая только char*, нет способа гарантировать 100%, что он правильно завершен нулем. Необходимо проявлять большую осторожность, чтобы гарантировать, что контракт между производителем и потребителем char* понимается как кто заканчивает строку.

Ответ 5

sizeof(a) - sizeof(const char*), размер указателя. Содержимое a не зависит от него. Для этого вам нужно strlen.

Кроме того, все двухцилиндровые строковые литералы, такие как ваш "abcd" в исходном коде, автоматически завершают нуль.

Ответ 6

sizeof (a) возвращает размер const char *a... не тот размер, на который он указывает. Вы можете использовать strlen(a) для определения длины строки с нулевым завершением и нет, результат strlen не включает нулевой ограничитель.