2016-11-12 18 views
-1

私は簡単な割り当てを行い、割り当てられたメモリを解放しようとしましたが、valgrindはこれらのエラーを書き込みます。 Cにおいて無効な読み込み/書き込み時のサイズ

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main() 
{ 

    char* area=(char*)malloc(3); 
    strcpy(area, "lal"); 
    printf("%s\n",area); 
    free(area); 

return 0; 
} 

Invalid write of size 4 
==2728== at 0x10873A: main (in /home/david/po1/a.out) 
==2728== Address 0x5200040 is 0 bytes inside a block of size 3 alloc'd 
==2728== at 0x4C2CB3F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==2728== by 0x108731: main (in /home/david/po1/a.out) 
==2728== 

答えて

2

、文字列すべてが単一0x00バイトでヌルターミネータ、で終わります。これは、自動的にすべての文字列リテラルの末尾に追加されているので、あなたがarea"lal"をコピーしたとき、あなたは実際にValgrindのは不満理由である4バイト、'l''a'areaから'l' & '\0'を、コピーされました。

C文字列を扱うときはいつもヌルターミネータのための十分なスペースがあることを確認してください!

+1

これは特に、文字列が二重引用符で囲まれている場合などに特に当てはまります。例えば、 'strcpy(area、" lal ");' – ron

+0

'strcpy()'はヌルターミネータをコピーします。いつコピーを停止するのかを知るためにターミネーターをヌルにする!この理由から、 'strcpy()'の使用は一般的に安全でないと考えられています。 –

+1

@AndrewDunn長さを最初に確認するか、長さを知っていれば完全に安全です。 –

関連する問題