2015-06-26 62 views
0

我有这样的代码..C如何strcpy的作品,它是否会改变原始字符串的大小?

#include <stdio.h> 
#include <string.h> 

int main() { 

    char a[6]="Hello"; 

    char b[]="this is mine"; 

    strcpy(a,b); 

    printf("%d\n",sizeof(a)); 
    printf("%d\n",sizeof(b)); 

    printf("%s\n",a); 
    printf("%s\n",b); 

    printf("%d\n",sizeof(a)); 

    return 0; 
} 

6 
13 
this is mine 
this is mine 
6 

我想问,即使我抄大strng到a但其大小没有改变,但它的内容正在发生变化,为什么?

任何帮助,将不胜感激..

回答

0

大小不是因为改变编译器的阵列a有一个固定的大小,你不能改变它,无人能及。

内容正在改变,因为没有检查数组的边界,它的工作原因是巧合。您发布的代码具有未定义的行为,其中一个可能的结果是它在您的案例中正常工作,但这不一定总会发生,例如为您的main()函数添加一个变量,它可能会停止工作。

1

您不能更改数组A的大小。strcpy意味着速度非常快,因此它假定您(即用户)传递足够大的数组以适合复制的字符串。你所做的是覆盖你的数组a的空终止符,并且改变你已经分配的内存。在很多情况下,这不会起作用并导致您的程序崩溃,但在一个简单的示例中它将运行。

1

数组a的大小为六个char,无法更改。当您将另一个更长的字符串复制到数组中时,会溢出数组,将不稳定性和安全性问题引入到程序中。

当计算机将程序加载到内存中时,字符串文字hello作为常量被加载到只读存储器中,数组所需的空间被分配到堆栈内存中,最后,字符串被复制到阵列。

在这种情况下,源字符串超出了目标数组的长度,因为数组a可以包含6个字符,并且您尝试复制到的字符串文字是13个字符。这导致缓冲区溢出,至少会导致错误。更糟糕的是信息泄漏的可能性和更严重的安全后果。

请参考strcpy的手册页:

Strcpy man page

在这个例子中的代码,它最低限度的工作,但是这是肯定的东西,以避免。

相关问题