код на c ++ компилируется, но не выполняется во время выполнения - PullRequest
0 голосов
/ 16 сентября 2011

Приведенный ниже код компилируется, но после нажатия на первую кнопку он разрывается с сообщением

Необработанное исключение по адресу 0x0133ae9a в файле deming.exe: 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 ]

7 голосов
/ 16 сентября 2011

Вы ошибаетесь здесь:

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

Вы пытаетесь изменить постоянную строку.

2 голосов
/ 16 сентября 2011

Причиной вашей проблемы является неправильное воображение того, что делает 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 ().

2 голосов
/ 16 сентября 2011
const char* image = "Images/image"; 

точнее.Вы не можете добавлять или изменять его любым способом.Используйте std :: string.

std::string image("Images/image");
image.append(1,'_');
2 голосов
/ 16 сентября 2011

Вы пытаетесь добавить символ к строковому литералу (т. Е. "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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...