strlen, чтобы вернуть size_t? - PullRequest
1 голос
/ 19 апреля 2011

В С:
Моя функция длины строки возвращает значение size_t?

Почему это не возвращает целое число, которое является обычным? И еще одна вещь, которую я заметил, была то, что, когда я пытался объединить эту строку с другой строкой, я получил ошибку шины, когда я запустил программу.

Контекст: я как бы играл с библиотекой gmp и конвертировал большие числа в строки, и в итоге я столкнулся с описанной выше ситуацией.

Что это за строка? Моя операционная система играет роль в этом вопросе? Я использую MAC, 64-битная ОС.

Отредактировано: полученное сообщение об ошибке:

: warning: format ‘%d’ expects type ‘int’, but argument 3 has type ‘size_t’

Спасибо!

@ all: Спасибо за ответы, но я подумал, что я опишу ошибку шины как еще один вопрос, потому что, похоже, это другая проблема.

Ответы [ 6 ]

4 голосов
/ 19 апреля 2011

Проблема в том, что int может быть недостаточно широким для хранения всего диапазона возможных значений длины.Например, в 64-битной строке вы можете иметь длину более 4 гигабайт, а если int равен 32 битам, вы не сможете вернуть длину такой длинной строки через переменную int.

3 голосов
/ 19 апреля 2011

strlen() всегда возвращает size_t ... и стандарт POSIX также говорит, что.

Полагаю, причина в том, что int имеет знак, а емкость даже unsigned int может оказаться недостаточной для хранения размера элемента (скажем, если у вас 32-разрядный тип int на x86-64 с 16 ГБ ОЗУ). .. пример экстремальный, но возможный.

3 голосов
/ 19 апреля 2011

POSIX strlen() возвращает size_t.

Что касается причины ошибки шины, невозможно сказать, не увидев код и не зная более подробной информации о точном характере ваших изменений. Возможно, вы вызвали переполнение буфера или сделали что-то с указателем NULL, чего не следовало делать.

2 голосов
/ 19 апреля 2011

Чтобы ответить на ваше предупреждение (что на самом деле является ошибкой - вы вызвали неопределенное поведение, передав неправильный тип printf), вы должны использовать %zu вместо %d для печати size_t значений.

2 голосов
/ 19 апреля 2011

strlen() возвращает size_t, поскольку, по крайней мере, ISO C90 - я только что проверил свою копию. И этот стандарт не должен иметь технических различий с ANSI C89.

Произошло изменение соглашения (size_t не было в K & R C), но это было давно.

1 голос
/ 19 апреля 2011

Существует очень простая и логичная причина для работы всех функций из стандартной библиотеки с size_t, когда речь идет о длинах блоков памяти - встроенный оператор sizeof дает результат size_t как хорошо.

Более того, size_t является неподписанным, определенного размера, привязанным к архитектуре и семантически отличным от простого int, который предназначен для хранения любого числа от числа деревьев вокруг вашего офиса до вашей репутации SO. .

...