为何调用返回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"),然后返回当前指针位置。
程序执行的完整过程
- 第一次调用
foo():str从初始位置后移4位,指向第二个"Lala"的开头,返回指针但未被使用。 - 第二次调用
foo():str再后移4位,指向第三个"Lala"的开头,返回指针仍未被使用。 - 第三次调用
foo():str又后移4位,指向第四个"Lala"的开头,printf接收该指针并输出对应的字符串,也就是"Lala"。
内容的提问来源于stack exchange,提问作者ms complaints
相关产品推荐
相关产品推荐

