Visual C ++ 6.0 - Почему переполнение границ массива? - PullRequest
1 голос
/ 08 сентября 2011

Я новичок в C ++, и я должен использовать массив. Проблема в том, что я получаю сообщение об ошибке «переполнение границ массива» в этой строке:

char arr[2] = "12";

Но когда я изменил его на:

char arr[3] = "12";

работает нормально, но почему?

Обновление:

И это работает: (

char arr[2] = {'1','2'};

Меня очень смущает разница между объявлениями, как они хранятся в памяти.

Ответы [ 4 ]

6 голосов
/ 08 сентября 2011

В семействе языков C пространства памяти, представляющие строки (char arrays), заканчиваются нулевым символом \0

Таким образом, память для хранения строки должна быть как минимум на один символ больше, чеможидаемый размер, когда вы записываете его с помощью " "

В вашем новом примере создается не строка, а массив символов.Поскольку вы переключили форму записи " " на { }, система больше не создает строку с нулевым символом в конце, а скорее создает массив, как вы и просили.

Суть в том, чтоСтроки являются специальными и имеют \0, прикрепленные к их концу системой автоматически, и поэтому требуют дополнительного места.

3 голосов
/ 08 сентября 2011

Это связано с тем, что к литеральным строкам в C и C ++ добавляется подразумеваемое '\ 0'. Она называется строкой с нулевым символом в конце, она помогает при попытке отследить длину строки вместо того, чтобы сохранять ее явно где-то в памяти.

3 голосов
/ 08 сентября 2011

Массив char имеет нулевой завершающий символ "\ 0" в конце каждой строки. Вам всегда нужно зарезервировать дополнительное пространство в вашем массиве для этого символа.

2 голосов
/ 08 сентября 2011

Поскольку строковые константы должны хранить NUL в конце строки, 2 символа памяти недостаточно, поэтому происходит переполнение. Вам нужно хранить «1», «2» и NUL, что составляет 3 символа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...