一个考察字符串指针变量的问题,此题目为该错题么:题目如下:
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,
},