ページ 1 / 1
mallocで確保した領域に文字列を
Posted: 2017年7月03日(月) 23:55
by あまつ
このプログラムでは"あいうえお"に必要な11バイトの領域をmallocで確保しています。が、2バイトや3バイトでもERRORが発生せず、出力されます。わかる方がいましたら教えてください。お願いしますm(_ _)m
コード:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
char *memo;
memo = (char *)malloc(11);
if(memo == NULL) {
printf("メモリが確保できません\n");
}else{
strcpy(memo,"あいうえお"); //2バイト × 5 + null文字 = 11バイト
printf("%s\n",memo);
}
free(memo);
}
Re: mallocで確保した領域に文字列を
Posted: 2017年7月04日(火) 01:18
by box
あまつ さんが書きました:このプログラムでは"あいうえお"に必要な11バイトの領域をmallocで確保しています。が、2バイトや3バイトでもERRORが発生せず、出力されます。
深刻なエラーが出るような領域をたまたま破壊していないだけです。
11バイト確保したならば、そこへ格納できるのは「プログラマーの責任で」11バイトまでです。
Re: mallocで確保した領域に文字列を
Posted: 2017年7月04日(火) 01:18
by みけCAT
確保した領域の範囲外へのアクセス(読み書き)は
未定義動作なので、何が起こってもおかしくありません。
正常に終了するかもしれないし、Segmentation Faultになるかもしれないし、鼻から悪魔が出てくるかもしれません。
Valgrindや
AddressSanitizerを使うと、エラーを検出できるかもしれません。
使い方の解説は、例えば
valgrindでC/C++のメモリリークを発見する - Qiita
clang の AddressSanitizer を使って、バッファオーバーフロー/ヒープオーバーフローを検出する - Qiita
Re: mallocで確保した領域に文字列を
Posted: 2017年7月04日(火) 02:30
by あまつ
は〜、とても勉強になりました!ありがとうございましたm(_ _)m