Вот мой код. Копирование 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);
}
Неопределенное поведение не требуется для возникновения сбоя или сегментации или что-то в этом роде. Программа может работать так же, как и ожидалось, без каких-либо проблем. Но не полагайтесь на это каждый раз. Однажды ваша программа может работать правильно, но в следующий раз это может не произойти! Избегайте UB любой ценой! –
«Видимо, работающий плавник» является частью «неопределенного hebaviour». –