2011-09-15 48 views
0

下面編譯代碼,但點擊第一個按鈕後,加味精打破C++代碼編譯,但未能在運行

在0x0133ae9a未處理異常deming.exe:0000005:訪問衝突寫入位置0x014aedbd。

這是一個c + +錯誤,因爲我是新手,或者它是我使用的dragonsdk?

//==================================================== 
// App.cpp 
//==================================================== 
#include "DragonFireSDK.h" 
#include <string.h> 

int Picture; 

int OnClick(int value) 
{ 
    char* image = "Images/image"; 
    image = strcat(image,"_"); 
    Picture = PushButtonAdd(image, 10, 100, OnClick, 1); 
    return 0; 
} 

void AppMain() 
{ 
    // Application initialization code goes here. Create the items/objects/etc. 
    // that your app will need while it is running. 

    Picture = PushButtonAdd("Images/Logo", 10, 100, OnClick, 1); 

} 
+0

學習使用調試器。這將讓你找出究竟是什麼線路造成麻煩。 –

+0

如果我的代碼每次編譯都有一美元,但運行時卻失敗了,我現在可以退休了。 – corsiKa

回答

2

你的問題的原因是錯誤的想象什麼樣的strcat。它將第二個緩衝區附加到第一個緩衝區 - 在這種情況下,您的第一個緩衝區是靜態的,因此附加到它顯然會失敗。你應該使用類似

char* image = "Images/image"; 
char* fullname = new char[strlen(image)+2]; 
strcpy(fullname, image); 
strcat(fullname,"_"); 

而且不要忘了delete[] fullname您與緩衝完成後。 你可能會在here

找到strcat的(和其他功能)有用的文檔也migh考慮使用C++的std :: string,因爲他們做的都是爲你,如果你需要C風格的字符串,可以隨時通過c_str()方法獲取它們。

+0

非常感謝它的工作原理。我使用的sdk將被移植到iphone sdk由dragonfiresdk我不知道我是否可以使用所有的C++庫因爲我不夠精通,所以我留下基本知識。 – user310291

7

你沒有在這裏:

char* image = "Images/image"; 
image = strcat(image,"_"); 

你試圖修改常量字符串。

2

您試圖將字符追加到字符串文字(即"Images/image"),並且這會導致訪問衝突,因爲它存儲在只讀內存中。

而應該做的:

char image[100]="Images/image"; // make it large enough to contain all the further modifications you plan to do 
strcat(image,"_"); 

這工作,因爲你是在使用本地緩存的工作,你可以隨意更換。

爲避免字符串文字帶來的其他錯誤,您應始終使用const char *指向它們,編譯器將不允許您嘗試修改它們。

順便說一下,由於您使用的是C++,所以沒有理由不使用C++字符串而不使用char * & co。

+0

如果我這樣說vs 智能感知:表達式必須是一個可修改的左值 – user310291

+0

「如果我這樣做」 - 「那」是什麼?添加'const'? –

2
const char* image = "Images/image"; 

更準確。你不能以任何方式追加或修改它。使用std :: string。

std::string image("Images/image"); 
image.append(1,'_');