出了几道C语言的题,考查各位内功,邀请各位一做

laciqs 2012-07-10 10:40:14
1. 有以下程序片段:
int a[] = { 1, 2 };
int *p = a;
问:
当sizeof(int) = 4时,
sizeof(a)=?
sizeof(p)=?
分别为什么?

2. 以下循环是死循环吗?
for (int i = 1; i > 0; i++)
printf("%d\n", i);
为什么?
3. 有以下程序片段:
int a[] = { 1, 2 };
int i = 5;
printf("%d\n", a[-1]);
输出结果可能是什么?
4. 有以下程序片段:
int i = 5;
int a[] = { 1, 2 };
printf("%d\n", a[3]);
输出结果可能是什么?
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];)这一行,改为等价程序。
(2)谈谈这个程序可能运行结果。
(3)小明说这个程序如果后来pi被设置为空指针的话,会导致死循环,还会破坏N多数据。你同意小明的观点吗?如果之后pi真的变成空指针的话,那一般在Windows/Linux下这个程序会是死循环吗?不是的话会发生什么?
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;,你同意他的做法吗?
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");呢?
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行不行?为什么?
...全文
6658 123 打赏 收藏 转发到动态 举报
写回复
用AI写文章
123 条回复
切换为时间正序
请发表友善的回复…
发表回复
Esakyo 2012-07-16
  • 打赏
  • 举报
回复
难道是作业题?
fdisksys 2012-07-16
  • 打赏
  • 举报
回复
[Quote=引用 113 楼 的回复:]

我是菜鸟,有一事不明,求指教。
int i=5;
int a[]={1,2};
这个,经过取址发现,i的地址和a[1]紧邻,而不是和a[0]紧邻啊。
入栈顺序不是i,a[0],a[1]吗?
可实际是,i和a[2]的地址是一样的。
[/Quote]
在栈上分配,并不代表是入栈操作,也不可能入栈操作.

____ 栈顶ebp 高地址
i ebp-4
a[1] ebp-8
a[0] ebp-12
.
.
.
____ esp

我就是有点还迷糊,&i应该是a[2],打印的时候为什么用的是a[3].



fdisksys 2012-07-16
  • 打赏
  • 举报
回复
[Quote=引用 113 楼 的回复:]

我是菜鸟,有一事不明,求指教。
int i=5;
int a[]={1,2};
这个,经过取址发现,i的地址和a[1]紧邻,而不是和a[0]紧邻啊。
入栈顺序不是i,a[0],a[1]吗?
可实际是,i和a[2]的地址是一样的。
[/Quote]
在栈上分配,并不代表是入栈操作,也不可能入栈操作.

____ 栈顶ebp 高地址
i ebp-4
a[1] ebp-8
a[0] ebp-12
.
.
.
____ esp

我就是有点还迷糊,&i应该是a[2],打印的时候为什么用的是a[3].



fdisksys 2012-07-16
  • 打赏
  • 举报
回复
第8题,强制转换,写MM的时候经常搞,但是很反感,写出的程序太不干净了.第七题,还没说为什么要调用printf
bingmiaor 2012-07-16
  • 打赏
  • 举报
回复
百度一下,你就知道……
wshn13 2012-07-16
  • 打赏
  • 举报
回复
关于第四题 Ubuntu 11.04 GCC 运行是随机值
dq 2012-07-16
  • 打赏
  • 举报
回复
可以说考考大家的基础,别说内功。
cainiao57 2012-07-15
  • 打赏
  • 举报
回复
我是菜鸟,有一事不明,求指教。
int i=5;
int a[]={1,2};
这个,经过取址发现,i的地址和a[1]紧邻,而不是和a[0]紧邻啊。
入栈顺序不是i,a[0],a[1]吗?
可实际是,i和a[2]的地址是一样的。
cainiao57 2012-07-15
  • 打赏
  • 举报
回复
[Quote=引用 108 楼 的回复:]

在机器上试了下题3和题4
分别把a和i的地址打印出来
C/C++ code

int a[] = {1, 2};
int i = 5;
printf("address of a: %p\n", a);
printf("address of i: %p\n", i);


结果
address of a: 0xb……
[/Quote]
108L,栈是低位向高位扩展的,堆才是高向低,所以栈是连续的,堆是随机的
cainiao57 2012-07-15
  • 打赏
  • 举报
回复
vc上边滴4题 a[3]是随机数呀
Emiapwil 2012-07-15
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 的回复:]

sizeof(a)应该也是4吧,数组名是指向首元素的指针,是指针。就看了1题,有时间过来瞅瞅~~~
[/Quote]

不对,在编译的时候里面这个数组会被看作是定长的数组,它的sizeof会返回数组元素个数*单个数组元素大小的值。
  • 打赏
  • 举报
回复
听君一席话,胜读十年书
dqxian 2012-07-14
  • 打赏
  • 举报
回复
楼主还是善于专研的。看似很基础的东西,善于探究其内部的工作原理,
从操作系统、编译器等去分析,值得表扬。写程序,不能只停留在如何
去写,更应该深入去理解程序内部做了些什么,是如何执行的,才能从
一个程序员上升为工程师,甚至是科学家。
Peugeot_Heart 2012-07-14
  • 打赏
  • 举报
回复
诶,俺也才读高一,谦虚点吧,这些基础的东西就收着吧。题目看着很不爽。
webscan2222 2012-07-14
  • 打赏
  • 举报
回复
lz支持你!看过斯坦福公开课,里面的老师也经常通过这种不太常见的写法来解释原理的。
caiyunl 2012-07-14
  • 打赏
  • 举报
回复
在机器上试了下题3和题4
分别把a和i的地址打印出来

int a[] = {1, 2};
int i = 5;
printf("address of a: %p\n", a);
printf("address of i: %p\n", i);

结果
address of a: 0xbf989304
address of i: 0xbf98930c


int i = 5;
int a[] = {1 , 2};
printf("address of i: %p\n", i);
printf("address of a: %p\n", a);

结果
address of i : 0xbf9e94dc
address of a : 0xbf9e94d4

按照书上的说法 栈的空间应该是由高地址往低地址分配的,但是为什么总是a是地址而i是高地址

ps:
Linux ubuntu 3.2.0-23-generic-pae #36-Ubuntu SMP Tue Apr 10 22:19:09 UTC 2012 i686 i686 i386 GNU/Linux

g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright © 2011 Free Software Foundation, Inc.



诶呦 2012-07-13
  • 打赏
  • 举报
回复
顶一下
看待问题的角度不同
duheying 2012-07-13
  • 打赏
  • 举报
回复
支持楼主,顶。不错
vc_player 2012-07-13
  • 打赏
  • 举报
回复
谁说没用的?基础决定上层建筑。越是基础的东西,重要性越大
支持楼主,加油
yb1230 2012-07-13
  • 打赏
  • 举报
回复
貌似你是高手,呵呵,说说你的实力
加载更多回复(85)

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧