C语言strCpy函数返回指向空终止符的指针却能正确输出字符串的原因疑问
C语言strCpy函数返回指向空终止符的指针却能正确输出字符串的原因疑问
嘿,这个问题问得特别到位,刚好能帮你理清C语言里指针和字符串的关键逻辑!咱们一步步拆解来看:
首先要戳破一个核心误解:你的main函数根本没用到strCpy的返回值!
你看main里的代码:
strCpy(string2, string1); printf("%s\n", string2);
这里你打印的是string2,它是数组的起始地址——也就是拷贝开始时dest指向的位置,而不是函数最后返回的那个指向'\0'的指针。所以哪怕函数返回的是字符串末尾的终止符,也完全不影响你打印string2的结果,因为你根本没用到这个返回值。
再说说你写的这个strCpy函数的设计:
- 标准库的
strcpy函数是返回目标字符串的起始地址(也就是传入的dest初始值),这样可以支持链式调用,比如printf("%s", strcpy(dest, src));。 - 而你写的这个函数,最后返回的是循环结束后的
dest(已经移到了'\0'的位置),这其实不符合标准strcpy的设计规范。
如果真的用这个返回值的话,结果就会和你预期的一样:
比如把main改成这样:
char *result = strCpy(string2, string1); printf("%s\n", result);
这时候打印出来的就是空字符串,因为result指向的是string2里的'\0',printf遇到'\0'就会停止输出。
最后再回顾一下拷贝过程:
当你调用strCpy(string2, string1)时,初始的dest指向string2[0],循环里逐个把orig的字符赋值给dest,同时两个指针都往后移。等循环结束,dest已经移到了string2里对应原字符串最后一个字符的下一位,然后你给它赋值'\0',这时候dest就指向了终止符,但string2的起始地址始终没变,所以直接用string2打印,自然能输出完整的拷贝后的字符串。
备注:内容来源于stack exchange,提问作者NicolasPaiva
相关产品推荐
相关产品推荐

