strcpy函数无法正常工作

时间:2017-07-11 17:47:21

标签: c arrays string strcpy strlen

请考虑以下代码。

#include<stdio.h>
#include<string.h>
void main()
{
    char a[6], b[6];

    strcpy(a,"rajeev");
    printf("print A:");
    for(int i=0;i<strlen(a);i++)
    {
         printf("%c",a[i]);
    }

    strcpy(b,a);
    printf("print B:");
    for(int i=0;i<strlen(b);i++)
    {
        printf("%c",b[i]);
    }

    printf("trying to print A again");
    for(int i=0;i<strlen(a);i++)
    {
        printf("%c",a[i]);
    }

在运行此程序时,在“尝试再次打印A”部分中不打印任何内容,strlen(a)将为0.这意味着源数组将为空。

你能帮我理解这背后的现象吗? 但是,将a[6]的声明更改为char* a=malloc(6)可以正常工作。

4 个答案:

答案 0 :(得分:4)

字符串文字"rajeev"的类型为char [7]。也就是说,它具有静态存储持续时间,并存储为初始化为

的数组
char unnamed[] = { 'r', 'a', 'j', 'e', 'e', 'v', '\0' };

因此,如果要使用函数strcpy将其内容复制为字符串,则需要在目标数组中提供足够的内存。例如

char a[7], b[7];

strcpy(a,"rajeev");
printf("print A:");
for ( size_t i = 0, n = strlen( a ); i < n; i++ )
{
     printf("%c",a[i]);
}

//... and so on

考虑到函数strlen计算字符直到遇到终止零。因此,如果字符数组不包含此字符,则函数的行为未定义。

答案 1 :(得分:2)

您的数组不足以容纳您尝试存储的字符串。

C中的字符串被定义为空终止的字符序列,这意味着正确的字符串在末尾有一个空字节。

你的数组可以容纳6个字节,但你的字符串char a[7], b[7]; 需要7个字节(字母为6个字节,最后一个字节为隐式空字节。因此,你写过数组的末尾。在数组边界外写入会调用undefined behavior

在您动态分配内存的情况下,您将再次调用未定义的行为。在这种情况下,出现才能正常工作。这是未定义行为可以表现出来的方式之一。

要解决此问题,您的数组需要至少7个元素:

android:path

答案 2 :(得分:0)

a&amp; b太小了,因为a刚好在b之后,strcpy执行后它的第一个字节为零。

malloc之所以有效,是因为这块内存是在内存中的其他位置分配的。但这只是偶然的,因为你写的内存比你分配的内存多。

任何以某种方式分配的内存访问都是非法的,而且是UB。

答案 3 :(得分:0)

您定义的数组char a[6], b[6]没有足够的空间来容纳您要存储的字符串。

请记住,C语言中的每个数组末尾都有一个空字节\0

您可以通过为数组提供足够的空间来修复它:

char a[7], b[7];
相关问题