You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何调用返回char*的foo()无编译错误?求解释C语言程序

问题解答

为什么直接调用foo()不报错?

这和static char* str完全没关系——C语言允许主动忽略任何函数的返回值,不管它返回的是什么类型。你写char* result = foo();是接收返回值的写法,但不接收、直接调用函数也是合法语法,编译器不会报错(除非开启-Wunused-result这类严格警告选项,此时会给出警告,但仍能编译通过)。

比如平时写printf("hello");,printf实际会返回打印的字符数,但大部分时候我们都不会接收这个返回值,道理是一样的。

关于static char* str的作用

静态变量才是程序最终输出"Lala"的核心:

  • static修饰的局部变量,只会在第一次调用函数时初始化一次,后续每次调用都会沿用之前的值,不会重新初始化。
  • 初始时str指向字符串常量"LalaLalaLalaLala"的起始地址,这个字符串可拆为4个连续的"Lala":Lala+Lala+Lala+Lala。
  • 每次调用foo(),str += 4会把指针往后移动4个字节(刚好跳过一个"Lala"),然后返回当前指针位置。

程序执行的完整过程

  1. 第一次调用foo():str从初始位置后移4位,指向第二个"Lala"的开头,返回指针但未被使用。
  2. 第二次调用foo():str再后移4位,指向第三个"Lala"的开头,返回指针仍未被使用。
  3. 第三次调用foo():str又后移4位,指向第四个"Lala"的开头,printf接收该指针并输出对应的字符串,也就是"Lala"。

内容的提问来源于stack exchange,提问作者ms complaints

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 21:04:54