c - 向 strcpy 提供一个非空终止的字符串

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

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

最佳答案

What is happening? Does strcpy(b,"string") not stop until it has gone through all the memory on the stack frame variables?

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

所以

strcpy(b, "ABCDEFGHILKLMNOP");

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

关于c - 向 strcpy 提供一个非空终止的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16238318/

相关文章:

C 指针(简单程序)

c++ - 比较两个字符串看它们是否旋转

c++ - 通过引用传递后字符串发生变化

c++ - vector<unique_ptr> 的唯一拷贝

file - 使用 PowerShell 复制没有文件的文件夹、没有文件夹的文件或所有内容

c - 使用 bfd 从跟踪中恢复位置信息

c - fork() 之后创建的子进程的父 pid_t

ios - 复制 UITableViewCells 错误

c++ - 二进制 + 的无效操作数

C 从字符串中删除字符