2016-03-02 5 views
-1

Это мой код:Правильное поведение, несмотря на отсутствие нулевой строки?

#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 это прекрасно, несмотря на (с моей точкой зрения), не имеющими нулевую терминатор. Почему это?

+2

Это неопределенное поведение. Ваше ожидание неверно. Вы не можете ожидать каких-либо конкретных результатов, когда Undefined Behavior находится в игре. – kaylum

+0

Одним из возможных объяснений является то, что в некоторых системах диспетчер кучи допускает определенные фиксированные размеры блоков для распределения памяти. Поэтому, возможно, 'malloc (4)' не может выделить ровно 4 байта и получит минимум 8 или 16 байтов от кучного менеджера. –

ответ

1

%s спецификатор формата в printf() ожидает оканчивающийся нуль строки.

в этом случае у вас есть неопределенные (UB). Иногда UB дает ожидаемые результаты.

Боковое примечание:

sizeof(char) является константой на всех платформах (1 байт), поэтому нет необходимости указывать его при распределении памяти.

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