下面是将一个字符串复制到另一个字符串的程序。我希望下面的程序给我一个warnig或一个错误,但它只是工作。
#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在字符串的末尾不包含任何空字符,但是主函数中的printf语句是如何工作的,因为我猜所有涉及字符串的函数都依赖于'\0'字符来标记字符串的结尾?
我得到了第一个问题的答案,但没有一个在下面讨论这个问题,我还发现奇怪的是,我可以直接使用指针dest和%s说明符在printf中,我刚刚写了最后一个打印主,以检查它是否有效,因为我刚才使用。
char *temp=dest
while(*temp!='\0')
{
printf("%c",*test++);
}代替printf("%s",dest)
发布于 2015-06-08 12:53:21
因为未定义行为是未定义的
通过省略终止'\0',然后使用"%s"说明符将“字符串”传递给printf(),程序将调用未定义的行为。
我在上面写了" string“,因为没有终止的'\0',它不是字符串,它只是一个字节序列,当您用一个'\0'终止一个字节序列时,它就变成了一个字符串。
因为你无法预测将要发生的事情,其中一件可能发生的事情就是它起作用了。
尽管你的程序有更多的问题
strlen() + 1,因为'\0'终止器,这才是程序中未定义行为的真正原因。calloc()叫错了,应该是
dest = calloc(1,1+ len);
请注意,我没有编写sizeof(char),因为它是超级的,它总是1,它必须按照c标准的要求编写。
在您的版本中,当您真正想要大小为len的len项时,您将分配一个大小为1的项。说明和建议
calloc(),您不需要将所有项初始化为0,因为您将立即覆盖它们,并且使用calloc()可能会将错误隐藏在内存调试器中。发布于 2015-06-08 12:56:28
C中的所有字符串都有一个特殊的终止字符'\0',这在使用strlen时不算在内。但是,所有字符串仍必须具有这个特殊的终止字符,否则所有字符串函数都将超过字符串的末尾。
在为字符串分配内存时,您需要为这个终止字符添加空间,并在最后添加它。
因此,您需要分配len字符,而不是只分配len + 1字符。并删除strcp函数中的注释,需要添加结束符。
https://stackoverflow.com/questions/30709640
复制相似问题