马术马车:关于c的两道面试题

来源:百度文库 编辑:中科新闻网 时间:2024/04/30 03:04:59
关于c的两道面试题,谁能给个答案,越详细越好,谢了
1. 请分析下面的程序,功能是通过指针将p值赋为2。
请问:p值最后应为多少?程序中是否有错误?如果有,分别是什么?
void main(void)
{
int p;
getData(&p);
}

void getData(int *p)
{
p = (int *)malloc(sizeof(int));
*p = 2;
}

2. 请分析下面的程序,功能是将用户输入的10个数输出。
请问:程序中是否有错误?如果有,怎么解决?
void main(void)
{
int *p, i, a[10];
p = a;
for (i = 0; i < 10; i++)
scanf("%d", p++);
printf("\n");
for (i = 0; i < 10; i++)
printf("%d", *p);
}

1.错误1:getData函数没有在调用之前声明。
错误2:getData函数中重新为临时指针分配内存空间,使得临时指针指向另一块内存,所以后面对其赋值时,主程序中的p没有被赋值。
看程序的意图,p应该被赋值为2。

2.很奇怪,照着题目运行,结果是对的。似乎定义几个局部变量的时候,他们的内存布局有种规律,如果把i的定义放在数组a的后面,程序就完全错了。因为输入p的时候,p是指向a[9]的下一个位置,内容没有定义。所以此时如果i刚好用了那块内存,输入的结果完成正确。
解决方法:printf("%d", a[i]);

第一个错拉
void main(void)
{
int p;(此处定义错误 应定义一个指向整型的指针啊 int *p;)
getData(&p);
}

我不是学C的,在这里我知道你第二题的错误,在第二个for前要再加一句:p=a;原因是你用第一个for 后,指针的位置已经移到a[9],你再用一个for时指针位置就从a[9]的下一个开始,得到的是一个随机的数。还有就是对应的在printf语句里把*p改成*p++,让指针下移,得到下一个值,否则只能得到a[1].为了让得到的数间分开,最好在print语句里加个空格。

void main(void)
{
int *p, i, a[10];
p = a;
for (i = 0; i < 10; i++)
scanf("%d", p++);
printf("\n");
p=a;
for (i = 0; i < 10; i++)
printf("%d ", *p++);
}

第一题,有错误,错误原因同2楼。现在修改如下:
void getData(int *p)
{ *p = 2;
}
void main(void)
{ int p;
getData(&p);
}
则P值为2。
第二题,没有错误。至于为什么我也不知道,看似有错误。不过3楼改的也对!