Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.09.2011, 11:28   #1
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию strcpy/writeable проблема.

Вообщем имеется следующий момент кода, изза которого возникает проблема с записью по памяти.

Код:
typedef struct SETITEM_OPTIONINFO
{
 char Name[255];	
} 
SETITEM_OPTIONINFO, *LPSETITEM_OPTIONINFO;
Код:
class CWzMemScript
{
public:
 char *GetString();

private:
 char TokenString[100];
};
Код:
char *CWzMemScript::GetString()
{
 return &this->TokenString[0];
}
То есть все очень просто, TokenString заполняется определенными данными и копируется в Name.
Олька мне сказала, что при попытке копирования strcpy выдает ошибку мол о проблеме с записью по памяти (access writeable)
Естественно секции кода и данных установлены в writeable/readable.

Код:
LPSETITEM_OPTIONINFO p;
strcpy(&p->Name[0], WzMemScript.GetString());
wtf? Вроде все правильно.

Последний раз редактировалось coNsept; 02.09.2011 в 12:39.
coNsept вне форума Ответить с цитированием
Старый 02.09.2011, 11:33   #2
pproger
C++ hater
Старожил
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Код:
LPSETITEM_OPTIONINFO p;
strcpy(&p->Name[0], WzMemScript.GetString());
Цитата:
Олька мне сказала, что при попытке копирования strcpy выдает ошибку мол о проблеме с записью по памяти (access writeable)
а чего ты ожидал? память под p не выделена то

про ужасный код я вообще молчу
Цитата:
char *CWzMemScript::GetString()
{
return &this->TokenString[0];
}
Цитата:
char *CWzMemScript::GetString()
{
return this->TokenString;
}
не?
а еще лучше и ПРАВИЛЬНЕЕ
Цитата:
const char *CWzMemScript::GetString() const
{
return this->TokenString;
}
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 02.09.2011 в 11:36.
pproger вне форума Ответить с цитированием
Старый 02.09.2011, 11:35   #3
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Код не мной написан, я выложил первоначальный вариант.
На самом деле я память выделял, но все тоже самое.

Код:
p = new LPSETITEM_OPTIONINFO;
strcpy(&p->Name[0], WzMemScript.GetString());
delete p;

Последний раз редактировалось coNsept; 02.09.2011 в 11:46.
coNsept вне форума Ответить с цитированием
Старый 02.09.2011, 11:40   #4
pproger
C++ hater
Старожил
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2coNsept
Цитата:
p = new LPSETITEM_OPTIONINFO;
)))))))))))))))))))) ты это, завязывай с тяжелыми наркотиками. выделял он память. под ЧТО ты ее выделил?

Код:
LPSETITEM_OPTIONINFO p = new SETITEM_OPTIONINFO;
strcpy(&p->Name[0], WzMemScript.GetString());
delete p;
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 02.09.2011, 11:54   #5
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Собственно я так и сделал. Но увы, все равно тоже самое, я озадачен.

Код:
const char *CWzMemScript::GetString() const
{
 return this->TokenString;
}
Код:
LPSETITEM_OPTIONINFO p = new SETITEM_OPTIONINFO;
strcpy(&p->Name[0], WzMemScript.GetString());
delete p;
coNsept вне форума Ответить с цитированием
Старый 02.09.2011, 11:59   #6
pproger
C++ hater
Старожил
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2coNsept
Код:
LPSETITEM_OPTIONINFO p = new SETITEM_OPTIONINFO;
strcpy(&p->Name[0], WzMemScript.GetString());
delete p;
абсолютно валидный код. может у тебя WzMemScript.GetString() невалидную строку возвращает? или возвращает строку длиннее Name?
Код:
LPSETITEM_OPTIONINFO p = new SETITEM_OPTIONINFO;
strcpy(&p->Name[0], "some_str");
delete p;
попробуй
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 02.09.2011, 12:35   #7
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Мдя, все равно. Что-то мне кажется, что тут &p->Name[0] виновник, хотя вроде все нормально.
Функция копирует первые 4 символа, дальше говорит о writeable.

Последний раз редактировалось coNsept; 02.09.2011 в 12:38.
coNsept вне форума Ответить с цитированием
Старый 02.09.2011, 12:46   #8
pproger
C++ hater
Старожил
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2coNsept
создай пустой проект, помести туда определение и синонимы своей структуры, и в main вставь ИМЕННО ЭТОТ код
Код:
LPSETITEM_OPTIONINFO p = new SETITEM_OPTIONINFO;
strcpy(&p->Name[0], "some_str");
delete p;
ты что-то делаешь невнимательно
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 02.09.2011, 13:04   #9
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Код:
#include "MyApp.h"
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <Windows.h>

typedef struct SETITEM_OPTIONINFO	// 50
{
	char Name[255];	
} 
SETITEM_OPTIONINFO, *LPSETITEM_OPTIONINFO;

class CWzMemScript
{
public:
	CWzMemScript() {};
	virtual ~CWzMemScript() {};
	const char *GetString() const;
 void SetString(const char Str[]);

private:
	char TokenString[100];
};

const char *CWzMemScript::GetString() const
{
	return this->TokenString;
}

void CWzMemScript::SetString(const char Str[]) 
{
	strcpy(this->TokenString, Str); 
}

int main(void)
{
	CWzMemScript WzMemScript;
	LPSETITEM_OPTIONINFO p = new SETITEM_OPTIONINFO;
	WzMemScript.SetString("Hello World");
	strcpy(p->Name, WzMemScript.GetString());
	puts(p->Name);
	_getch();
	return 0;
}
Вообщем работает все нормально, но в проекте почему-то не хочет... Ладно pproger спасибо тебе за помощь, буду копать.
coNsept вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с strcpy() TheWanderer Общие вопросы C/C++ 13 04.07.2013 03:20
strcat,strcpy Акоб Общие вопросы C/C++ 15 24.04.2011 23:58
strlen,strcpy,strcmp(Visual C++) crit Visual C++ 14 09.04.2009 19:10
не работает strcat(),strcpy() MeGaTpoH Общие вопросы C/C++ 5 25.01.2009 17:31
strcpy (visual c++ 6.0) JOFRIF Visual C++ 2 04.08.2008 12:19