求职笔试题目

一个考察字符串指针变量的问题,此题目为该错题么:题目如下:

char *setstring(void)

{

char a[20]="helolo world";

return a;

}

void string(void)

{

char *p=NULL;

p=setstring();

printf("%s/n",p);

}

错误就在子函数中,修改如下:

char *setstring(void)

{

char *a="helolo world";

return a;

}

这样就可以了。

原因如下:如1种错误情况下,数组整个都是存放在栈去的也就是字符串字符内容都是在栈中存放的,在执行return语句时,显然函数返回值已经没有意义了。返回的地址虽然仍然是字符串的首地址,但里面内容已经不是原来的字符串了。而对于正确的2来说,chanr * a=”hello world”,也是把指针变量存放在栈中,但字符串的内容确实存放在常量区中,这就是指针和字符数组应用时的一个问题。显然可以返回得到p的值,也就是字符串首地址,返回后把p释放掉,但此时地址已经传到主函数中,字符串在常量区也没有被释放掉,就可以得到正确的返回值。更具体的内容可以参考反汇编语句。

 

题目二:

设有 n  个人围成一圈,对他们进行顺时针编号,从第  m   个人开始数1,数到第  q  个人,第q个人出局。接着从出局人的下一个开始从1数,同样第q个人出局,最终这些人全部出局。请以下面的函数实现将出局人的次序以双向链表形式实现。lnode *  locatenode(int n,int m,int q),其中,lnode定义如下 type define struct node {

                                                      int order,

                                                       lnode*  before,

                                                      lnode*        after,

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值