将char*复制到char*

8

这是我的代码部分:

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?

你在哪里为指针p分配了内存? - Praveen S
4个回答

11

在使用strcpy函数时,你需要预先分配好要传递的内存。例如,p = new char[s1.length()+1];(+1为字符串结束符0)。然而,没有充分理由的情况下不建议混合使用std::string和C字符串处理函数。最好选择使用std::string,这会节省您很多麻烦。

此外,lKey=p也不起作用——它只是将p的本地地址复制到局部变量lKey中。调用者甚至看不到任何区别。


如果我想对p进行一些修改,然后将其分配给lkey怎么办? 假设: 我调用methodone(p); 然后我想将结果分配给lkey,我该怎么做? - Zee99
嗨,亚历山大,我遇到了类似的问题,我发现你的答案很有用。我有一个小问题:你能详细说明一下你的第二段话吗?除了lKey=p之外,调用者需要什么才能正确地接收到lkey的新值?干杯 - Bruno
@ibiza:lKey需要是一个由调用者分配的缓冲区,然后您可以使用strcpy将其复制到其中。但要注意不要超出缓冲区的末尾。或者,使用char **,并让函数malloc一个足够大的缓冲区来容纳字符串。 - Alexander Gessler

10

实际上,问题出在strcpy(p,s1.c_str());上,因为p从未被设置为除NULL以外的任何值。


@Zee99 strcpy只是复制数据。p是指向未分配内存的指针。因此,当您进行复制时,只是将其复制到内存位置0,这是非法的。 - Romain Hippeau

9

记住,char*只是一个内存位置的地址。在使用它之前需要在这个地址上分配内存。

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

strcpy不会为缓冲区分配内存,它只是拷贝数据到内存地址。

如果您将缓冲区传递到函数中,则可能希望仅使用以下代码(并删除 p):

strcpy(lKey, s1.c_str());

0
  1. 删除 p(它在这里没有作用),并直接将数据从 s1 复制到 lkey
  2. 不是要打击你,但缩进方案很糟糕,请从其他地方复制一个好的样式(谷歌 1tbs)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接