3

这是代码

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 的字符串不是以空值结尾的。这导致 a 的内容被删除,因为 b 在内存 (0028FF30) 中位于 (0028FF20) 之前。

怎么了?strcpy(b,"string") 在遍历堆栈帧变量上的所有内存之前是否不会停止?抱歉,如果我没有使用正确的术语。:)

4

2 回答 2

7

怎么了?strcpy(b,"string")在遍历堆栈帧变量上的所有内存之前不会停止?

strcpy复制字节,直到它在源中找到一个 0 字节。即被复制到目的地,然后strcpy返回。(如果目标不足以容纳包含 0 终止符的源,则行为未定义,但除非您遇到分段错误,否则在实践中您可以依靠发生这种情况。)

所以

strcpy(b, "ABCDEFGHILKLMNOP");

将 17 个字节 - 16 个字母和 0 终止符 - 从字符串文字复制到b仅包含 16 个元素的数组。这意味着 0 终止符被写入数组末尾的一个元素b。在您的情况下,这是 中的第一个字节a,并且strcpy(b, "ABCDEFGHIJKLMNOP");有效地a包含一个空字符串。

于 2013-04-26T14:12:16.033 回答
3

的大小"abcdefghijklmnop"是 16,a数组的大小是 16,它应该是 17(16 + 1 个空终止符)

于 2013-04-26T14:01:02.963 回答