您的位置:首页 > 编程语言 > C语言/C++

几道C语言题(含参考答案)

2012-07-13 13:15 162 查看
1. 有以下程序片段:

int a[] = { 1, 2 };

int *p = a;

问:

当sizeof(int) = 4时,

sizeof(a)=? 8,数组嘛,数组个数乘以每个元素大小

sizeof(p)=? 4,所有指针都是4

分别为什么?

2. 以下循环是死循环吗?

for (int i = 1; i > 0; i++)

  printf("%d\n", i);

为什么?
理论上不会死循环,因为到了i到了2147483647的时候,再+1会变成-2147483648,就会结束循环,但是估计好几天之后才能运行到那个时候

3. 有以下程序片段:

int a[] = { 1, 2 };

int i = 5;

printf("%d\n", a[-1]);

输出结果可能是什么?
正常编译器的话,会输出i的值,原因是栈区数据,既然是栈那么定义a变量之后,再定义i,根据栈的特性,会放到a的前面,a[-1]表示的就是i,虽然越界很危险,但是确实windows,linux都会输出i的值5

4. 有以下程序片段:

int i = 5;

int a[] = { 1, 2 };

printf("%d\n", a[3]);

输出结果可能是什么?
同问题3,还是局部栈的原因,但是不一定会输出5,有个关于数组内存对齐情况在内,VC和linux的GCC应该输出5,别的编译器不一定

5. 有以下程序片段:

int array[ARRAY_SIZE];

int *pi;

for (pi = &array[0]; pi < &array[ARRAY_SIZE];)

  *++pi = 0;

(1)修改for (pi = &array[0]; pi < &array[ARRAY_SIZE];)这一行,改为等价程序。
for (pi = &array[0]; pi < &array[ARRAY_SIZE];*++pi = 0;) 这样?

(2)谈谈这个程序可能运行结果。
第一个元素没有成功初始化为0,程序会出现越界问题。。原因是:运行到最后一步,pi=&array[ARRAY_SIZE-1] , 运行*++pi=0会越界

(3)小明说这个程序如果后来pi被设置为空指针的话,会导致死循环,还会破坏N多数据。你同意小明的观点吗?如果之后pi真的变成空指针的话,那一般在Windows/Linux下这个程序会是死循环吗?不是的话会发生什么?
windows/linux如果pi成了0,会出现段错误,程序直接跳出,不会死循环破坏N多数据

6. 有一个函数如下:

char *strcpy(char *dest, const char *src)  

{  

  char *temp = dest;  

  if (dest == src)  

  return dest;  

  if (dest == NULL || src == NULL)

return NULL;  

  while (*dest++ = *src++)

  ;  

  return temp;  

}  

小明说如果把if (dest == NULL || src == NULL) return NULL;改为if (dest != NULL || src != NULL)就可以巧妙地利用顺序结构的特点简化掉一个return NULL;,你同意他的做法吗?
if (dest != NULL && src != NULL) 至少在windows里边,这个应该能行得通

7. 有这样一个程序:

#include <stdio.h>

void foo (void)

{

  int i;

  printf("%d\n", i);

  i = 999;

}

int main (void)

{

  foo();

  foo();

  return 0;

}

运行结果可能为什么?为什么?在foo();之间加个printf("hello\n");呢?
第一次不可预知(如果在VC里的话,应该是0xcccccccc的10进制形式-858993460),第二次输出999;如果之间加个hello,第二次不一定(VC里可能是6,linux里应该还是999),依赖编译器

8. 某人为了给学生讲讲什么是指针写了如下程序:

#include <stdio.h>

int main(int argc, char *argv[])

{

 int a[5] = { 1, 2, 3, 4, 5 };

 unsigned int p;

}

程序还没写完,请把p当作指针用它来遍历数组a,输出数组a的所有元素。

写完后思考一下,不用unsigned int用int行不行?为什么?
int main(int argc, char *argv[])
{
int a[5] = { 1, 2, 3, 4, 5 };
unsigned int p;
p = (unsigned int)a;
for( int i = 0; i < 5; ++i )
{
printf( "%d,", ((int*)p)[i] );  //*(int*)(p+i*sizeof(unsigned int))
}
return 0;
}


这样?

用int的话,需要多做一次转换把他转换成unsigned int 否则某些系统如果内存分配到0x80000000之后的话,就会小小的悲剧

来自:http://topic.csdn.net/u/20120710/10/172da13c-3653-4b50-9b2f-b5bc2f71819d.html?seed=1453765484&r=79116377#r_79116377
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息