gpt4 book ai didi

c - 指针和字符数组

转载 作者:行者123 更新时间:2023-12-02 08:27:36 27 4
gpt4 key购买 nike

下面是将一个字符串复制到另一个字符串的程序。我希望下面的程序给我一个警告或错误,但它工作正常。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void strcp(const char *source,char *dest)
{
while(*source!='\0')
{
*dest++=*source++;
}
// *dest='\0';
}
int main(void)
{
char source[]="This is a test string";
int len=strlen(source);
char *dest = (char *)calloc(len,sizeof(char));
strcp(source,dest);
printf("\n The destination now contains ");
printf("%s",dest);
return 0;
}

这里我已经注释掉了*dest='\0'所以 *dest 在字符串的末尾不包含任何空字符但是 main 函数中的 printf 语句如何工作正常,因为我猜所有涉及字符串的函数都依赖于 '\0' 字符来标记字符串的结尾?

附言我得到了第一个问题的答案,但下面没有一个答案谈到这个问题而且我发现很奇怪我可以直接在 printf 中使用指针 dest%s 说明符我只是在 main 中写了最后一个 printf检查它是否有效,因为我之前使用过

char *temp=dest
while(*temp!='\0')
{
printf("%c",*test++);
}

代替 printf("%s",dest)

最佳答案

因为未定义的行为未定义

通过省略终止符 '\0',然后将“string”传递给带有 "% s" 说明符,您的程序调用未定义的行为。

我在上面写了“string”,因为没有终止 '\0' 它不是一个字符串,它只是一个字节序列,当你终止一个序列带有'\0'的字节,然后,它就变成了一个字符串。

由于您无法预测会发生什么,因此可能发生的事情之一就是它有效。

虽然你的程序问题比较多

  1. 您分配的空间少于所需空间。您需要 strlen() + 1,因为 '\0' 终止符,这是程序中未定义行为的真正原因。

  2. 你调用的calloc()错了,应该是

    dest = calloc(1, 1 + len);

    请注意,我不写 sizeof(char) 因为它是多余的,它总是 1,它必须是 c 标准所强制的。

    在您的版本中,当您真正需要 len 个大小为 1 的项目时,您正在分配一个大小为 len 的项目。


注意事项和建议:

  1. 在这种情况下不要使用 calloc(),您不需要将所有项目初始化为 0,因为您将立即覆盖它们,并使用 calloc( ) 可能会隐藏内存调试器的错误。

  2. Do not cast void * in c.

关于c - 指针和字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30709640/

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