首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指针和字符数组

指针和字符数组
EN

Stack Overflow用户
提问于 2015-06-08 12:50:09
回答 2查看 91关注 0票数 2

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

代码语言:javascript
复制
#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中,我刚刚写了最后一个打印主,以检查它是否有效,因为我刚才使用。

代码语言:javascript
复制
char *temp=dest
while(*temp!='\0')
{
   printf("%c",*test++);
}

代替printf("%s",dest)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-08 12:53:21

因为未定义行为是未定义的

通过省略终止'\0',然后使用"%s"说明符将“字符串”传递给printf(),程序将调用未定义的行为。

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

因为你无法预测将要发生的事情,其中一件可能发生的事情就是它起作用了。

尽管你的程序有更多的问题

  1. 您分配的空间比所需的要少。您需要strlen() + 1,因为'\0'终止器,这才是程序中未定义行为的真正原因。
  2. 你把calloc()叫错了,应该是 dest = calloc(1,1+ len); 请注意,我没有编写sizeof(char),因为它是超级的,它总是1,它必须按照c标准的要求编写。 在您的版本中,当您真正想要大小为lenlen项时,您将分配一个大小为1的项。

说明和建议

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

Stack Overflow用户

发布于 2015-06-08 12:56:28

C中的所有字符串都有一个特殊的终止字符'\0',这在使用strlen时不算在内。但是,所有字符串仍必须具有这个特殊的终止字符,否则所有字符串函数都将超过字符串的末尾。

在为字符串分配内存时,您需要为这个终止字符添加空间,并在最后添加它。

因此,您需要分配len字符,而不是只分配len + 1字符。并删除strcp函数中的注释,需要添加结束符。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30709640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档