2017-01-30 2 views
0

Вот мой код. Копирование 4 байтов в место, которое имеет 3 байта зарезервированной памяти malloc(). Здесь, согласно моим знаниям, поскольку памяти недостаточно, строка не заканчивается нулем. то есть ABC находятся в 3 байтах в области кучи. Здесь, поскольку null не существует в конце, printf не должен печатать q.ptr, но печатает "ABC". Как это возможно?Printf() не показывает неопределенное поведение со строкой, которая не заканчивается нулем

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 
struct p 
{ 
    char *ptr; 
}; 
void main() 
{ 
    struct p p,q; 
    p.ptr="ABC"; 
    q.ptr=(char *)malloc(3*sizeof(char)); 
    strcpy(q.ptr,p.ptr); 
    printf("%s\n",q.ptr); 
} 
+0

Неопределенное поведение не требуется для возникновения сбоя или сегментации или что-то в этом роде. Программа может работать так же, как и ожидалось, без каких-либо проблем. Но не полагайтесь на это каждый раз. Однажды ваша программа может работать правильно, но в следующий раз это может не произойти! Избегайте UB любой ценой! –

+1

«Видимо, работающий плавник» является частью «неопределенного hebaviour». –

ответ

6

strcpy не знает, что ваш буфер слишком короткий. Он просто написал 4 байта, с 1 за пределами.

Это может аварии в этом месте (если вы попали границу страницы, например, попробуйте запустить что с электрический забор включен (-lefence вариант ссылка на Linux)), или имеют неприятный побочный эффект на другие части вашей программы.

So printf работает должным образом, но вы можете написать где-нибудь, где вам не разрешено.

Смежные вопросы