C++における0 xC 00000005アクセス競合の問題

1272 ワード

フォン・ノイマン構造CPU(i 386,ARM A 8,A 9など)の保護モードまたはハーバード構造(8051,ARM M M 0,..M 3など)のCPUの下で、C++コンパイラは定数を置くメモリを読み取り専用モードに設定するか、読み取り専用メモリに入れるか、定数メモリにデータを書き込むとアクセス競合異常が発生する.
Turbo C/Borland C++のようなDOSの実モードのコンパイラでは、エラーが発生しない可能性があります.
たとえば、文字列を反転します.
#include "stdio.h"

#include "string.h"



//     

char* ReverseStr(char* str, int len) 

{

 char* header= str;

 char* tail= str + len -1;

 char temp;//        

 while(header<tail)

 {

  temp = *header;

  *header= *tail;

  *tail= temp;  

  ++header;

  --tailer;

 }

 return str;

}



int main()

{

 char* s = "abcde";

 printf("    :%s
",Reverse_Str(s, strlen(s))); getchar(); return 0; }

上のプログラムは間違いがないように見えますが、
実行時
*header=*tail;および*tail=temp行は異常を放出します://xxxx.exeの0 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
問題は変数宣言:char*s="abcde";
このように文字列変数sを定義すると、sポインタはスタックに保存されますが、文字列「abcde」は定数であり、定数領域に保存され、書き込み保護され、反転関数では*header=*tailは、定数メモリの値を変更し、書き込み保護されるので、メモリの書き込みエラーが報告されます.
この問題は、「abcde」をスタックまたはグローバル変数に定義すると存在しません.
char s[20]; 
strcpy(s, "abcde");