Вот часть моего кода:
extern "C" REGISTRATION_API int extreme(char* lKey)
{
string s1;
char *p=NULL;
try
{
ifstream myfile ("extreme.txt");
int i=0;
if (myfile.is_open())
{
while (getline(myfile,s1))
{
switch (i)
{
case 1:
strcpy(p,s1.c_str());
lKey=p;
break;
//continue here
}
}
}
}
Теперь, когда я вызываю эту функцию из внешнего приложения, я получаю эту ошибку:
AccessViolationException:
Предпринятый для чтения или защищенная от записи память. Это часто - признак, что другая память повреждена.
Проблема происходит из-за этого:
lKey=p;
Как я могу присвоиться lKey
кому: p
?
Вам необходимо предварительно выделить память, которую вы передаете на strcpy
. Т.е. a p = new char [s1.length () + 1];
сделает это (+1 для завершающего символа 0). Однако не рекомендуется смешивать подпрограммы std :: string
и строки C без уважительной причины. Лучше использовать std :: string
, это избавит вас от множества проблем.
Также lKey = p
тоже не будет работать - он просто копирует локальный адрес p
в локальную переменную lKey
. Звонящий даже разницы не увидит.
На самом деле проблема заключается в strcpy(p,s1.c_str());
поскольку p
никогда не устанавливается ни на что, кроме NULL.
Помните, что char*
- это просто адрес участка памяти. Вам нужно, чтобы по этому адресу была выделена память.
В вашем коде у вас нет памяти, выделенной для использования, и вы не установили p для указания на этот адрес памяти.
strcpy
не выделяет буфер, он просто берет адрес памяти для копирования данных.
Если вы передаете буфер в функцию, то вам, вероятно, нужно просто это (и удалить p)
strcpy(lKey, s1.c_str());