2010-07-15 60 views
3

这里是我的代码部分:副本的char *为char *

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:
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

的问题是由于这样的:

lKey=p; 

我如何分配给lKeyp

+0

你在哪里分配内存到指针p? – 2010-07-15 14:29:05

回答

8

你需要预先分配,你传递给strcpy内存。即一个p = new char[s1.length()+1];将做到这一点(+1为终止0字符)。但是,将std::string和C字符串例程混合使用并不是一个好主意。更好地坚持与std::string,它会为您节省大量的麻烦。

此外lKey=p也不会工作 - 它只是将本地地址p复制到本地变量lKey。来电者甚至不会看到区别。

+0

如果我想对p执行一些修改然后将其分配给lkey,该怎么办? 让我们说: 我打电话给methodone(p); 然后我想把结果分配给lkey,我该怎么做? – Zee99 2010-07-16 06:56:46

+0

嗨亚历山大,我面临着类似的问题,我发现你的答案有用。我有一个小问题:请你详细说明你的第二段?需要什么而不是lKey = p,以便调用者能够正确接收lkey中的新值?欢呼 – ibiza 2011-11-15 17:52:35

+0

@ibiza:lKey需要是一个调用者分配的缓冲区,那么你可以用'strcpy'来调用它。不过,请注意不要超出缓冲区的末端。或者,也可以使用'char **'并使函数'malloc'成为一个足够容纳字符串的缓冲区。 – 2011-11-15 18:10:00

10

实际上问题是strcpy(p,s1.c_str());,因为p从不会设置为NULL而不是NULL。

+0

@ Zee99 strcpy只是复制数据。 p是指向未分配内存的指针。因此,当你复制你只是复制到内存位置0,这是非法的。 – 2010-07-15 14:32:16

7

请记住,char*只是一个内存位置的地址。你需要在地址分配内存。

在你的代码中,你没有分配内存来使用,你没有设置p来指向那个内存地址。

strcpy不分配缓冲区,只需要一个内存地址将数据复制到。

如果你传递一个缓冲区中的功能,那么你可能要简单,就是(和删除P)

strcpy(lKey, s1.c_str()); 
1
  1. 消除P(它是在这里什么都不做),并从复制数据S1直接LKEY
  2. 不打你,但是缩进计划是很滑稽,请警察良好的作风从某处(谷歌1tbs)