1. ホーム
  2. スクリプト・コラム
  3. その他

[解決済み】C言語で "Abort trap: 6 "エラー?

2021-12-30 16:45:42

質問

C言語のコードは次のとおりです。

#include <stdio.h>
#include <string.h> 
int main(){
    char name[12] = "Roman Mirov"; 
    printf("My name is %s\n", name);
    name[8] = 'k'; 
    printf("My name is %s\n", name);
    char greeting[] = "hello"; 
    printf("%s %s\n", greeting, name);
    strcpy(greeting, "greetings, "); 
    printf("%s%s\n", greeting, name);
    return 0;
}

gcc を通して xcode で実行すると、コンソールに表示されます。

My name is Roman Mirov
My name is Roman Mikov
hello Roman Mikov
Abort trap: 6

最後の行は、"greetings, Roman Mikov"が出力されません。

解決方法は?

この場合、宛先の greeting の内容をすべて格納するのに十分なスペースがありません。 ソース を呼び出す境界外アクセスです。 未定義の動作 .

詳しく説明すると、配列のサイズ greeting は、与えられたイニシャライザのサイズによって決定されます。

char greeting[] = "hello";

この場合 "hello" で、ヌルターミネータを含めて6個となる。

さて、後でもっと大きな 文字列 をメモリに格納します。

strcpy(greeting, "greetings, ");

ここで、ソースは12バイトのサイズであるのに対し、デスティネーションは6バイトしかありません。このため、バウンダリーオーバーランが発生し、UBという結果になります。UBの副作用として、クラッシュ(またはアボート)が発生する可能性があります。