c语言 - 指针(错题)




错题一

  1. 对于以下代码段,正确的说法是:
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】才是引起程序退出的直接原因。


错题二

  1. 以下代码段,正确的输出是:
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”,编译器会给数组在栈中分配内存空间,并将字符串存入数组的空间中,所以你能修改它的值。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零号萌新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值