错题一
- 对于以下代码段,正确的说法是:
char *p;
while (1) {
p = (char*)malloc(1);
*p = 0;
}
A. 最终程序会因为没有没有空间了而退出
B. 最终程序会因为向0地址写入而退出
C. 程序会一直运行下去
D. 程序不能被编译
正确答案:B
答案解析:
- A. 这确实是引起程序终止的原因,但不是直接原因。
- B. 程序一直分配内存,肯定会引起内存耗尽。而
malloc()
函数在分配内存失败时并不会终止程序,而是返回NULL指针
。而第4行代码试图向NULL指针
位置写入数据,这会引起程序终止(通常操作系统会因为“段错误”而终止程序)。因为系统保证空指针不指向任何实际的对象或函数,即无法给空指针赋值。 - C. 肯定无法永远运行下去。
- D. 这段代码是合法的,所以可以编译。
所以【选项B】才是引起程序退出的直接原因。
错题二
- 以下代码段,正确的输出是:
int main()
{
char *str = "Hello,word";
str[0] = 'h';
printf("%s", str);
}
A、hello,word
B、Hello,word
C、%s
D、没有输出
正确答案:D
答案解析:
- 如果选A,那就成功被坑了。
- 运行结果会出现段错误,原因在于,
char *str=“Hello world”
这句仅仅声明了一个指针变量,指向字符串"Hello,world",而程序没有给这个"Hello,world"字符串分配空间,编译器把它分配到常量区。而常量字符串的值是不允许被修改的,所以会出现段错误。 str[ ]=“Hello world"
是定义的一个长度为12的字符数组,所以对于字符串"Hello world”,编译器会给数组在栈中分配内存空间,并将字符串存入数组的空间中,所以你能修改它的值。