2015-06-09 4 views
-3
char* init_array() 
{ 
    const int size = 5; 
    char *p = (char*) malloc(size * sizeof(char)); 
    strcpy(p, "Hello, world! How are you?"); 

    return p; 
} 

с размером = 5, malloc должен получить 5 свободных символов из памяти, но данная строка не вписывается в 5 символов, но она работает.C - strcpy с размером malloc меньше размера аргумента

Мой вопрос: почему? Сначала я думал, что результат будет усечен, но p - это полная строка, а не только «Hello» или «Hell \ 0»

Я использую GCC в Linux. Связано ли это с компилятором или стандартным материалом?

+0

Откуда вы знаете, что это работает? то, что вы наблюдаете, - это «неопределенное поведение».Вы знаете, что ваш код неисправен, но эти ошибки не всегда приводят к сбоям или сбоям, на самом деле все может произойти. –

+0

Добро пожаловать в переполнение стека! Стандартное предупреждение: [Не выдавать результат malloc] (http://stackoverflow.com/q/605845/1151654) – Eregrith

+0

Просто распечатайте указатель возврата, используя printf («% s», init_array()); – usrc

ответ

1

Это называется неопределенным поведением, так как оно не определено, иногда оно работает. Да, вы можете записать блок памяти в c, но это незаконно, потому что оно вызывает неопределенное поведение, поэтому поведение не предсказуемо, и ваша программа может работать или не работать.

Что вы ожидаете от strcpy() не происходят, потому что strcpy() копирует столько символов, сколько он находит до '\0' завершающих байт, он не заботится, если буфер назначения достаточно велик, это то, что вы должны нести ответственность о.

Если вы хотите скопировать точное количество байтов (скажем 5) вы можете использовать

memcpy(p, "Hello, this string is very large but it doesn't matter", 5); 

, но нужно учитывать, что p не является допустимой строкой после этого, потому что он не имеет завершающего '\0'.

У вас также есть 2 других общей плохая практика, что новые Программисты делать

  1. Вам не нужно отбрасывать возвращаемое значение из malloc().

  2. Вам не нужно использовать sizeof(char), потому что это по определению.

Так,

p = malloc(size); 

должно быть достаточно, чтобы выделить место для строки в size - 1 символов.

+0

Настоящим предлагаю заменить 'ошибка' на« плохую практику ». Вы не возражаете? :-) –

+1

@NatashaDutta Это намного лучше, чем сноска ... –

0

То, что вы испытываете это buffer overflow

Короче говоря, вы пишете на недействительные адреса памяти, ссылающегося Undefined Behavior. Все может случиться.

0

Кажется, что это сработало, но на самом деле ваш код вызывает неопределенное поведение. Вы записываете данные в нераспределенную ячейку памяти.

Следует отметить, что в

strcpy(str1, str2); 

strcpy не имеет возможности проверить, является ли указал строку на str2 впишется в массив символов str1. В вашем случае он будет продолжать копировать символы от "Hello, world! How are you? до конца массива p пунктов.

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