读者:为什么代码: char *p = "hello, worl!"; p[0] = ’H’; 会崩溃?
阿一:字符串实字并不总是可以修改的, 除非是用在字符数组的初试化。试用: char a[] = "hello, world!"。
读者:“Segmentation violation”, “Bus error” 和 “General protection fault” 意味着什么?
阿一:通常, 这意味着你的程序试图访问不该访问的内存地址, 一般是由于堆栈出错 或是不正确的使用指针。可能的原因有: 局部数组溢出;不小心, 用了空指针。未初始化指针、地址未对齐的指针 或其它没有适当分配的指针;malloc 内部被破坏;函数调用参数不匹配, 特别是如果用了指针, 两个可能出错的函数是 scanf() 和 fprintf()。
读者:什么是C语言最好的代码布局风格?
阿一:如果你的编码环境没有建议一个风格, 你也不想发明自己的风格, 可以沿用 K&R 中的风格。“好风格” 的品质并不简单, 它包含的内容远远不止代码的布局细节。不要把时间都花在格式上而忽略了更实质性的代码本身的质量。
读者:用 if(!strcmp(s1, s2)) 比较两个字符串等值,是否是个好风格?
阿一:这并不是个很好的风格, 虽然这是个流行的习惯用法。如果两个字符串相等, 这个测试返回为真, 但 ! (“非”) 的使用, 容易引起误会, 以为测试不等值情况。另一个选择是用一个宏: #define Streq(s1, s2) (strcmp((s1), (s2)) == 0)