24 / 07 / 08

「一生一芯」Learn C the hard way - Ex 1

练习 1:启用编译器

新建 helloworld.c 并写入以下代码。

int main(int argc, char *argv[]) { puts("Hello world."); return 0; }

$ make helloworld.c 报错 make: Nothing to be done for 'helloworld.c'.

解决方式: make helloworld

编译后提示:(与教程下述 $ CFLASS='-Wall' make helloworld 结果一致)

cc helloworld.c -o helloworld helloworld.c: In function ‘main’: helloworld.c:3:5: warning: implicit declaration of function ‘puts’ [-Wimplicit-function-declaration] 3 | puts("Hello world."); | ^~~~ helloworld.c:1:1: note: include ‘<stdio.h>’ or provide a declaration of ‘puts’ +++ |+#include <stdio.h> 1 | int main(int argc, char *argv[])

解决方式:添加 #include <stdio.h> 即可。

附加题 1

在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后运行它看看发生了什么。

提示 Segmentation fault,**STFW:**Segmentation faults in C or C++ is an error that occurs when a program attempts to access a memory location it does not have permission to access.

推测可能删除的部分与程序访问的内存地址相关,删除后程序访问了错误的地址。

附加题 2

再多打印5行文本或者其它比"Hello world."更复杂的东西。

#include <stdio.h> int main(int argc, char *argv[]) { puts("Hello world."); for(int i = 1; i < 6; i++) { for(int j = 0; j < i; j++) { printf("%%"); } printf("\n"); } return 0; }

踩坑 1:puts 自带换行。

踩坑 2:% 是转义字符,要输出需要 %%

附加题 3

执行 man 3 puts来阅读这个函数和其它函数的文档。

提供了定义的头文件、不同的 puts 类型作用、返回值、相关函数等信息。