c ++代码编译但在运行时失败

时间:2011-09-15 23:46:07

标签: c++ visual-c++

下面的代码编译,但点击第一个按钮后,它会打开msg

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);

}

4 个答案:

答案 0 :(得分:7)

你在这里失败了:

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

您正在尝试修改常量字符串。

答案 1 :(得分: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 *&amp;共

答案 2 :(得分:2)

const char* image = "Images/image"; 

更准确。您不能以任何方式附加或修改它。使用std :: string。

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

答案 3 :(得分:2)

你的问题的原因是错误想象strcat的作用。它将第二个缓冲区附加到第一个缓冲区 - 在这种情况下,您的第一个缓冲区是静态的,因此附加缓冲区显然会失败。你应该使用像

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

完成缓冲后,也不要忘记delete[] fullname。 您可以在here

中找到有关strcat(和其他函数)的有用文档

你也可以考虑使用C ++ std :: string,因为它们为你完成所有这些,如果你需要c风格的字符串,你总是可以通过c_str()方法获得它们。