mallocで確保した領域に文字列を

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
あまつ

mallocで確保した領域に文字列を

#1

投稿記事 by あまつ » 7年前

このプログラムでは"あいうえお"に必要な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);
   
}

box
記事: 2002
登録日時: 13年前

Re: mallocで確保した領域に文字列を

#2

投稿記事 by box » 7年前

あまつ さんが書きました:このプログラムでは"あいうえお"に必要な11バイトの領域をmallocで確保しています。が、2バイトや3バイトでもERRORが発生せず、出力されます。
深刻なエラーが出るような領域をたまたま破壊していないだけです。
11バイト確保したならば、そこへ格納できるのは「プログラマーの責任で」11バイトまでです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: mallocで確保した領域に文字列を

#3

投稿記事 by みけCAT » 7年前

確保した領域の範囲外へのアクセス(読み書き)は未定義動作なので、何が起こってもおかしくありません。
正常に終了するかもしれないし、Segmentation Faultになるかもしれないし、鼻から悪魔が出てくるかもしれません。
ValgrindAddressSanitizerを使うと、エラーを検出できるかもしれません。
使い方の解説は、例えば
valgrindでC/C++のメモリリークを発見する - Qiita
clang の AddressSanitizer を使って、バッファオーバーフロー/ヒープオーバーフローを検出する - Qiita
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

あまつ

Re: mallocで確保した領域に文字列を

#4

投稿記事 by あまつ » 7年前

は〜、とても勉強になりました!ありがとうございましたm(_ _)m

返信

“C言語何でも質問掲示板” へ戻る