簡體   English   中英

C ++代碼編譯但在運行時失敗

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM