C char массив и \ 0 - PullRequest
       14

C char массив и \ 0

0 голосов
/ 27 апреля 2018

В C, если я инициализирую массив символов следующим образом:

char lines[5];
memcpy((char *)line,"Hello",5)

Тогда, если я выполню следующее выражение:

line[6]='\0';

Это приведет к переполнению буфера? Спасибо

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

много проблем. С одной стороны, зачем приводить к char *, когда это то, к чему распадается массив? Во-вторых, вам нужно использовать индекс на основе нуля, а не индекс на основе одного; Первый элемент массива a это a[0], а не a[1].

Также вы должны были установить размер буфера 6, а не 5, чтобы освободить место для терминатора

0 голосов
/ 27 апреля 2018

Вы определенно пишете за пределами массива, что приводит к неопределенному поведению . Результат может быть любым из следующих:

  • ошибка выполнения (segfault);
  • поврежденные данные (перезапись части другого объекта);
  • ведет себя точно так, как ожидалось

Большинство платформ предъявляют требования к выравниванию, чтобы между концом массива и следующим объектом в памяти могло быть несколько неиспользуемых байтов 1 , и запись одного или двух байтов после конца массива isn ' большая часть проблемы. Но это не то же самое, что компилятор, выделяющий «дополнительное пространство» для массива.


В любом случае, если размер массива не кратен 2 или 4 байтам.
0 голосов
/ 27 апреля 2018

Тогда, если я выполню следующее выражение:

line[6]='\0';

Это приведет к переполнению буфера?

Да. Потому что lines содержит пять символов, а вы перезаписываете седьмой.

Будет ли компьютер назначать 8 байтов для строк?

номер

Может быть добавлено 3 байта после заполнения lines, в этом случае это все еще переполнение буфера, потому что lines по-прежнему имеет длину 5 байтов.

...