提供一个非空格终止于strcpy的字符串

时间:2013-04-26 13:57:25

标签: c string copy

这是代码

smem_dmp(char *name, char content[])
{                     
        int i;
        int len = strlen(content);       

        printf("%s\n\n", name);

        for(i = 0; i < len; i++)
        {
             printf("%c\t%p\n", content[i], &content[i] );     
        }

        printf("Done\n\n");
}

print_bar()
{
     printf("********************************************************************\n");
}

int main(int argc, char *argv[])
{
    char a[16];
    char b[16];


    strcpy(a, "abcdefghijklmnop");
    printf("a = %s\nb = %s\n\n",a,b);

    smem_dmp("A", a);
    smem_dmp("B", b);

    print_bar();

    strcpy(b, "ABCDEFGHILKLMNOP");
    printf("a = %s\nb = %s\n\n",a,b);

    smem_dmp("A", a);
    smem_dmp("B", b);

    system("PAUSE");    
    return 0;
}

从查看a和b驻留在记忆中的位置,我已经找到了正在发生的事情。复制到b的字符串不是以null结尾。这导致a的内容被删除,因为b位于内存(0028FF30)之前(0028FF20)。

发生了什么事? strcpy(b,“string”)是否在经过堆栈帧变量的所有内存之前不会停止?对不起,如果我没有使用正确的术语。 :)

2 个答案:

答案 0 :(得分:6)

  

发生了什么事? strcpy(b,"string")在遍历堆栈帧变量的所有内存之前是否会停止?

strcpy复制字节,直到它在源中找到0字节。将其复制到目标,然后strcpy返回。 (如果目标不足以容纳包含0终止符的源,则行为未定义,但除非您遇到分段错误,否则实际上您可以依赖于此。)

所以

strcpy(b, "ABCDEFGHILKLMNOP");

将17个字节--16个字母和0个终止符 - 从字符串文字复制到数组b,它只包含16个元素。这意味着0-terminator被写为超出数组b末尾的一个元素。在您的情况下,这是a中的第一个字节,而strcpy(b, "ABCDEFGHIJKLMNOP");实际上使a包含空字符串。

答案 1 :(得分:2)

"abcdefghijklmnop"的大小为16,a数组的大小为16,应为17(16 + 1 null终结符字符串)