почему этот код дает нарушение прав доступа при запуске на msdev? - PullRequest
2 голосов
/ 16 июля 2009

while(*a++ = *b++){} где a и b - действительные указатели на символы.

Ответы [ 5 ]

11 голосов
/ 16 июля 2009

Если b - это строка из 10 символов с нулевым символом в конце и a - это буфер, в котором было выделено 4 символа, вы будете писать вне выделенной памяти, используя приведенный выше код.

7 голосов
/ 16 июля 2009

Один альтернативный ответ:

char *a = "Hello";
char *b = "World";

Это действительные указатели на символы. Но a не указывает на доступную для записи память.

3 голосов
/ 16 июля 2009

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

1 голос
/ 16 июля 2009

Похоже, что память, выделенная для массива 'a', меньше длины массива 'b'.

0 голосов
/ 16 июля 2009

Если вы запускаете его на MSDev, загрузите его в отладчик и пройдитесь по нему, и / или посмотрите на области памяти, где хранятся a и b, и посмотрите, что происходит. Это может быть любая из вещей, уже упомянутых как возможности.

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