1

このコードがセグメンテーション違反を引き起こさない理由がわかりません:

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

int main (void){
    char* c;
    strncpy(c,"Gustave",10);
    return 0;
}

そして、これは次のことを行います:

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

void aux (void){
    char* c;
    strncpy(c,"Gustave",10);
}

int main (void){
    aux();
    return 0;
}

私にとって、割り当てられていないメモリにアクセスしているため、2つはセグメンテーション違反を起こすはずです。

別の質問は次のとおりです。

これがセグメンテーション Fault ではなくバス エラーを引き起こすのはなぜですか :

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

void aux (void){
   char* const c = "Bonjour";
   strncpy(c,"BonjourBonjour",20);
}

int main (void){
    aux();
    return 0;
}
4

3 に答える 3

0

あなたが正しく指摘したように、未割り当てのメモリにコピーしようとしているので、未定義の動作が生成されますが、私のIDEでは両方のケースでセグフォルトが生成されます。エディット バス エラーに追加するだけで、プロセッサが要求されたメモリ アクセスを試みることさえできない場合に発生します。プロセスに属していないメモリにアクセスすると、セグメンテーション違反が発生する

于 2014-05-27T08:43:58.237 に答える
0

コード 1 が segfault しない場合は、「運」があるためです。文字列は、2 番目のコードではなく、プログラムに割り当てられたメモリに書き込まれる可能性があります。

于 2014-05-27T08:42:26.273 に答える