0

このコードは、cygwin および Linux でエラーなしでコンパイルされます。しかし、実行すると、cygwin ではエラーなしで実行されますが、Linux ではコアダンプします。

これらのシステムのメモリ管理について誰かが光を当てて、異なる動作の理由を説明できますか?

#include <stdio.h>
void foo(char *p){
 p[0]='A';
}

void main(){
  char *string ="Hello world!";
  foo(string);
  printf("%s\n", string);
}

回答に感謝し、動作が定義されていないことは理にかなっていますが、これら2つの異なる未定義の動作につながる基礎となるシステムの違いに興味がありました. 彼らがメモリを管理する方法に関連していると思いますが、内部に精通していて、一方がクラッシュし、もう一方がクラッシュしない理由を説明できる人を探しています。

4

3 に答える 3

1

C++ では、文字列リテラルを変更してはなりません。そして、そのポインターを使用して、それがあなたがやろうとしていることです。

変更したい場合は、次のように宣言する必要があります。

char string[] = "Hello world!";
于 2013-03-26T02:45:34.107 に答える
1

char* を変更すると、未定義の動作が発生します。クラッシュしないからといって、クラッシュしないという意味ではありません。それが未定義の意味です。動作は予測できません。あなたの場合、プログラムがクラッシュしないことも予測できません。

于 2013-03-26T02:45:39.287 に答える
0

定数文字列の変更は未定義の動作です。

また、次のように定義main()してください

int main(void)
{
  //your program
  return 0;
}
于 2013-03-26T02:42:25.813 に答える