下面的代码编译,但点击第一个按钮后,它会打开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);
}
答案 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
你也可以考虑使用C ++ std :: string,因为它们为你完成所有这些,如果你需要c风格的字符串,你总是可以通过c_str()方法获得它们。