Это мой код:Правильное поведение, несмотря на отсутствие нулевой строки?
#include <string.h>
#include <strings.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char ** argv) {
char some_string[4] = "ball";
char * pointer = malloc(sizeof(char) * 4);
strncpy(pointer, some_string, sizeof(char) * 4);
printf("String is %s\n", some_string);
printf("String in the pointer is %s\n", pointer);
return 0;
}
Здесь я намеренно объявлен массив символов размером 4 и оставил не место для нулевого терминатора. Всякий раз, когда я печатал его, я получал странные (непечатаемые) значения, добавленные до конца (как и ожидалось). Тем не менее, я также ожидал то же самое для переменной pointer
, потому что в ней не должно быть нулевого терминатора (поскольку у него есть только пространство для 4 char
, поэтому нет места для \0
. Однако всякий раз, когда я запускаю этот код, some_string
всегда испорчен, после того, как около 50 попыток pointer
это прекрасно, несмотря на (с моей точкой зрения), не имеющими нулевую терминатор. Почему это?
Это неопределенное поведение. Ваше ожидание неверно. Вы не можете ожидать каких-либо конкретных результатов, когда Undefined Behavior находится в игре. – kaylum
Одним из возможных объяснений является то, что в некоторых системах диспетчер кучи допускает определенные фиксированные размеры блоков для распределения памяти. Поэтому, возможно, 'malloc (4)' не может выделить ровно 4 байта и получит минимум 8 или 16 байтов от кучного менеджера. –