2013-08-08 2 views
0

Я написал ошибочный фрагмент кода, который разбился только после нескольких прогонов в режиме выпуска в визуальной студии (более 50). Может кто-нибудь объяснить, почему этот фрагмент кода не разбился намного раньше.memcpy сбой после нескольких прогонов

char *pcBuffer= "Some Text"; 
char *pctempBuff = NULL; 

    pctempBuff = malloc(100); 
    memset(pctempBuff,0,100); 
    memcpy(pctempBuff,pcBuffer,100); 

Вышеупомянутый код разбился после нескольких прогонов.

я исправил его на следующий код, который является правильным, и он больше не падает

char *pcBuffer= "Some Text"; 
char *pctempBuff = NULL; 

pctempBuff = malloc(strlen(pcBuffer)+1); 
memset(pctempBuff,0,strlen(pcBuffer)+1); 
memcpy(pctempBuff,pcBuffer,strlen(pcBuffer)+1); 
+0

Что это за программа? снова загружается ли изображение программы после каждого malloc, или вы mallocing в том же экземпляре программы? – Magn3s1um

+0

Как правило, нет смысла обсуждать * неверную * программу, так как не требуется детерминированного поведения. –

+0

@ Magn3s1um Это часть огромной программы. Исправлено это решение моей проблемы. Я просто хотел узнать, почему он вызывает крах после долгого времени. – user1692342

ответ

3

Есть две ошибки в вашем исходном коде.

malloc может не работать, возвращая NULL в низкой памяти. Если вы продолжаете выделять память, не освобождая ее, система в конечном итоге исчерпает память, а malloc вернет NULL. Вы должны проверить для этого

pctempBuff = malloc(100); 
if (pctempBuff != NULL) { 
    memset(pctempBuff,0,100); 
    memcpy(pctempBuff,pcBuffer,strlen(pcBuffer)+1); 
} 

Вы также чтение памяти, вы не владеете, говоря memcpy скопировать 100 байт из адреса 10 байт pcBuffer. Это приводит к неопределенному поведению. Поражение после многих, казалось бы, успешных итераций было бы возможным (если это маловероятно) примером этого. Второй пример правильный, потому что он считывает только память для pcBuffer.

Поскольку вы копируете строку, вы могли бы сделать это более четко/легко/безопасно, используя strcpy

pctempBuff = malloc(100); 
if (pctempBuff != NULL) { 
    strcpy(pctempBuff,pcBuffer); 
} 
+0

Если мы попытаемся memcpy 100 байт из 10 байтов pcBuffer, это неопределенная ошибка? Это означает, что он может скопировать некоторые нежелательные 90 байтов или он может не делать ничего плохого, а также правильно? – user1692342

+1

@ user1692342 По стандарту он не определен, что означает, что вы не можете предсказать результат вообще. –

+0

@ user1692342 Копирование 90 байтов непредсказуемого контента - лучшее, на что вы могли бы надеяться. Попытка сделать это может показаться, что она работает несколько раз только для того, чтобы потерпеть крах при следующей попытке. – simonc

0

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

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