以下是我的代码的一部分:
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
?
答案 0 :(得分:11)
您需要预先分配传递给strcpy
的内存。即p = new char[s1.length()+1];
将执行此操作(终止0字符为+1)。但是,没有充分理由混淆std::string
和C字符串例程并不是一个好主意。最好坚持使用std::string
,这样可以省去很多麻烦。
同样lKey=p
也不起作用 - 它只是将p
的本地地址复制到本地变量lKey
中。来电者甚至看不出差异。
答案 1 :(得分:10)
实际上问题是strcpy(p,s1.c_str());
,因为p
永远不会设置为NULL。
答案 2 :(得分:8)
请记住,char*
只是内存位置的地址。您需要在该地址分配内存。
在您的代码中,您没有分配使用的内存,并且您没有将p设置为指向该内存地址。
strcpy
没有分配缓冲区,只需要一个内存地址来复制数据。
如果要将缓冲区传递给函数,那么您可能只需要这个(并删除p)
strcpy(lKey, s1.c_str());
答案 3 :(得分:0)