注册 登录
编程论坛 C++教室

请教一个内存分配上的问题

sd791002 发布于 2015-06-20 17:55, 373 次点击
程序代码:
#include <iostream>
using namespace std;
int main()
{
    char string[]={"ABCDE"};
    char *p;
    char *q;
    p=string;
    while( *p != '\0' )
            p++;
    p--;
    q=string;
    char *temp=new char;
    for(;q<=p;q++,p--)
    {
        *temp=*p;
        *p=*q;
        *q=*temp;
    }
    cout<<string<<endl;

//    reverse_string(string);
    cout<<string<<endl;
    return 0;
}


以上是我临时写的一个反向排列字符串的小程序  但是  一旦在开头初始化char *string="ABCDE"的时候就会出现问题  调试发现在*p=*q那一步无法写入
请教下原因?
7 回复
#2
wp2319572015-06-20 18:52
vs2010  没啥问题
#3
诸葛欧阳2015-06-20 19:17
程序代码:
#include <iostream>
using namespace std;
int main()
{
    char string[]="ABCDE";//定义字符串
//加双引号就行了
    char *p;
    char *q;
    p=string;
    while( *p != '\0' )
            p++;
    p--;
    q=string;
    char *temp=new char;
    for(;q<=p;q++,p--)
    {
        *temp=*p;
        *p=*q;
        *q=*temp;
    }
delete temp;//申请完内存要释放
    cout<<string<<endl;

//    reverse_string(string);
   
// cout<<string<<endl;
    return 0;
}
#4
yangfrancis2015-06-21 21:35
回复 楼主 sd791002
你确定不是p=string;
这步出问题吗?字符串的赋值好像需要用strcpy函数吧。
#5
TonyDeng2015-06-22 12:22
這是學過C之後造成蹩脚C++的問題。1樓的代碼是後來改過的,他原先初始化那句不是那樣寫,改成這樣之後下面又出了問題。歸根結底,就是學過C之後把string視爲cz字符串指針的結果,殊不知string是一個對象引用。
#6
TonyDeng2015-06-22 12:28
用了string,就不要再用char*,string也不是char*指針。

用char*字符串(cz)初始化std::string的寫法:

std::string s("ABCDE");

變量名s是std::string對象,用cz字符串"ABCDE"初始化,實際上編譯器在編譯時是把後者的内容複製到對象内部,原始的數據不會再用到了。
#7
TonyDeng2015-06-22 12:45
再補充一下:在C++上用std::string,真的千萬不要當那是C一樣的字符數組或指針用,也不要尋求這個對象的地址試圖自己去訪問數據,因爲它的内存空間是可以隨時變動的,這種情形多發生在修改過數據内容之後,特別是字符串拼接。
1