为什么memcpy会改变字符串数组?

时间:2012-12-06 18:33:32

标签: c++

我的代码是这样的。你能告诉我为什么它的表现不像我期望的那样吗?

/*
 * test.cpp
 *
 *  Created on: Dec 6, 2012
 *      Author: sandeep
 */

#include<iostream>
#include<string.h>
using namespace std;

int main()
{
    int i=0;
    string s="hello A B:bye A B";
    char *input;
    input=new char(s.size());
    for(i=0;i<=s.size();i++)
        input[i]=s[i];
    char *tokenized1[2],*tokenized2[3];
    tokenized1[0]=strtok(input,":");
    tokenized1[1]=strtok(NULL,":");
    i=0;
    char *lstring;
    while(i<2)
    {
        lstring=new char(strlen(tokenized1[i]));
        memcpy(lstring,tokenized1[i],strlen(tokenized1[i])+1);
        cout<<tokenized1[0]<<"  "<<tokenized1[1]<<endl;
        tokenized2[0]=strtok(lstring," ");
        tokenized2[1]=strtok(NULL," ");
        tokenized2[2]=strtok(NULL," ");
        char c=tokenized2[0][0];
        cout<<c<<endl;
        cout<<tokenized2[0]<<"  "<<tokenized2[1]<<"  "<<tokenized2[2]<<endl;
        i++;
    }

}

,输出就是这个。

hello A B  by
h
hello  A  B
hello A B  by
b
by  

在输出的第1行,第4行和第6行末尾有一些垃圾值。 当我对tokenized1[1]进行记忆复制时,为什么tokenized1[0]被改变了?以及如何解决这个问题?

3 个答案:

答案 0 :(得分:5)

以下new电话中有几个错误。你需要使用方括号;此外,争论还有一个。

lstring=new char[strlen(tokenized1[i]) + 1];

如果没有方括号,则为一个字符分配空间。结果,memcpy()写入了已分配的内存。

编辑:我刚注意到其他new,这也需要修复:

input=new char[s.size() + 1];

最后,s[i]读取字符串末尾的结尾:

for(i=0;i<=s.size();i++)
    input[i]=s[i];

可能还有其他错误,更不用说内存泄漏......

答案 1 :(得分:0)

您似乎没有终止'输入'

答案 2 :(得分:0)

除了NPE所说的,还有其他几件小事:

char *input;
input=new char(s.size());

这可能与它有关 - 您正在分配单个字符。然后编写一个字符,并覆盖用于who-know-what的其他内存。试试这个:

char *input = new char[s.size() + 1];

另一个问题是你的循环,紧接着它:

for(i=0;i<=s.size();i++)
        input[i]=s[i];

至少在我的系统上,使用偏移量等于s.size()的std :: string :: operator []失败;我不知道你的具体实现,但我很好,它也失败了。保持安全,而不是抱歉,并重新编码你的循环:

for(i = 0; i < s.size(); i++)
    input[i] = s[i];

input[i] = 0;

我希望这会有所帮助。