![](/img/trans.png)
[英]If C++ compiles to machine code, why do we need to install a 'runtime'?
[英]c++ code compiles but failed at runtime
下面的代碼可以編譯,但是單擊第一個按鈕后,它會與味精一起中斷
deming.exe中0x0133ae9a處未處理的異常:0xC0000005:訪問沖突寫入位置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);
}
您在這里失敗:
char* image = "Images/image";
image = strcat(image,"_");
您正在嘗試修改常量字符串。
您試圖將字符附加到字符串文字(即"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。
const char* image = "Images/image";
更准確。 您不能以任何方式附加或修改它。 使用std :: string。
std::string image("Images/image");
image.append(1,'_');
您遇到問題的原因是對strcat所做的事情的錯誤想象。 它將第二個緩沖區附加到第一個緩沖區-在這種情況下,您的第一個緩沖區是靜態的,因此附加到它顯然會失敗。 您應該使用類似
char* image = "Images/image";
char* fullname = new char[strlen(image)+2];
strcpy(fullname, image);
strcat(fullname,"_");
完成緩沖區操作后,也不要忘記delete[] fullname
。 您可能會在這里找到有關strcat(和其他功能)的有用文檔。
您可能還會考慮使用C ++ std :: string,因為它們可以為您完成所有操作,如果您需要c樣式的字符串,則始終可以通過c_str()方法獲取它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.