gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 09:36:42 28 4
gpt4 key购买 nike

这里是代码

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com