小さなC言語問題ポインタ配列付与---ポインタと配列について.

1220 ワード

まずコードをつけましょう.
#include <iostream>
#include <cstring>
using namespace std ;

int replacefun(char* str, char c1, char c2);

int main(void)
{
	char * p = "I love you China, do you love me?";    //               
	int m = 0;
	m = replacefun(p, 'o', 'c');
	cout << m << endl;
	return 0;
}

int replacefun(char* str, char c1, char c2)
{
	int num = 0;
	while (*str != '\0')
	{
		if (*str == c1)
		{
			*str = c2;  //             
			num++;
		}
		str++;
	}
	return num;
}

このプログラムは指定した文字を置き換えることを目的としており、コンパイル時にエラーはありませんが、実行中にプログラムが意外に終了します.
そこで、利器を起動して、単一のステップでデバッグします...関数に飛び込んだ後、*strが'o'に達する前にすべて正常であることが分かったが.'o'に着いた後、メモリが間違っていて、値を割り当てることができませんでした.
いろいろ調べた結果、
char *p="abcde";の場合、文字列は修正できません!一方char p[]=「abcde」;の場合、文字列は修正できます!同じ文字列で、ポインタで定義するときは定数領域、配列で定義するときはスタックにあります.さっきのI love you China、do you love me?定数です.
おばさんによれば
"I love you China, do you love me?"保管中rodataセグメント、このセグメントは読み取り専用で、強引に修正するときは、もちろん間違いを報告します.
配列の形式として定義すると、この文字列を配列にコピーし、配列の内容を勝手に変更することができます.元の文字列は変わらない...
以上まとめて、ポーズを上げました.
C++を続行します.
アルゴリズムが未完で続きます...