为什么我的源在c中使用strcpy时会发生变化

时间:2011-03-17 13:36:22

标签: c++ c strcpy

使用strcpy源后,损坏并获得正确的目标。以下是我的代码请告诉我为什么我的源代码被破坏了?如果我将第二个字符数组q []保持固定大小,那么我的源码不会被更改。为什么这种奇怪的行为。 -
我正在使用MSVC 2005

void function(char* str1,char* str2);
void main()
{

    char p[]="Hello world";
    char q[]="";
    function(p,q);
    cout<<"after function calling..."<<endl;
    cout<<"string1:"<<"\t"<<p<<endl;
    cout<<"string2:"<<"\t"<<q<<endl;
    cin.get();
}

void function(char* str1, char* str2)
{
    strcpy(str2,str1);
}

输出:

after function calling...
string1:        ld
string2:        Hello world

提前致谢,
Malathi

7 个答案:

答案 0 :(得分:8)

strcpy不分配存储字符串所需的内存。 在执行str2之前,您必须在strcpy中分配足够的内存。 否则,在覆盖某些未分配的内存时会出现未定义的行为。

答案 1 :(得分:6)

q只有1个字符的空格,即终止\0。 请阅读一本关于C的书 - 你需要学习一些关于内存管理的知识。

很可能你的记忆看起来像这样(简化):Qpppppppppppp。所以当你strcpy到q时,你将覆盖p内存的部分内容。

由于您使用的是C ++:只需使用std::string和/或std::stringstream代替原始字符数组。

答案 2 :(得分:4)

在您的代码中,q是一个单元素数组(基于""的长度,由于空终止符而等于1),因此它不能包含整个字符串。因此,您无法执行strcpy,因为它会写入无效的内存位置(尝试向数组写入太多数据)。

声明q足够大以包含您的字符串。此外,您可以使用strncpy为安全起见。

答案 3 :(得分:3)

char q[] = "";创建一个只包含1个元素的字符数组 - 将更多数据复制到其中将不会为其保留更多内存。

所以,当你写出超过为q保留的空间时,你会开始覆盖p中的内容 - 两个变量在内存中彼此相邻。

答案 4 :(得分:2)

数组“q”只有一个字节长;它肯定没有空间的字符串“你好,世界”!当您尝试将“Hello,World”复制到q时,最终会超出q的边界并覆盖堆栈中与其相邻的p。我想象一下如何在堆栈上绘制这些东西的图表,你可以确定为什么最终在p中的垃圾只是“ld”。

答案 5 :(得分:2)

strcpy希望您提供已分配的存储缓冲区,而不仅仅是char *指针。如果您将char q[]="";更改为char q[50];,则可以使用。由于你只给strcpy一个指向零长度字符串的指针,它没有足够的空间来存储复制的字符串,并且覆盖也会破坏内存。

答案 6 :(得分:2)

每个人都说的是正确的一半。代码失败,因为没有为副本保留空间,正如其他人正确指出的那样。缺少的部分是您的对象在堆栈上,而不是堆。因此,不仅可能,而且不可避免地会导致代码损坏,因为无法再解开堆栈。