C puzzles详解【38-45题】
第三十八题
What is the bug in the following program?
#include <stdlib.h>
#include <stdio.h>
#define SIZE 15
int main()
{
int *a, i; a = malloc(SIZE*sizeof(int)); for (i=; i<SIZE; i++)
*(a + i) = i * i;
for (i=; i<SIZE; i++)
printf("%d\n", *a++);
free(a);
return ;
}
题目讲解:
printf打印栈中值时,a的值被改变,所以最后free(a)中a的值并不是之前分配的栈的起始地址。
第三十九题
Is the following a valid C program? If so, what is the output of it?
#include <stdio.h>
int main()
{
int a=, b = ; printf(&a["Ya!Hello! how is this? %s\n"], &b["junk/super"]);
printf(&a["WHAT%c%c%c %c%c %c !\n"], ["this"],
["beauty"],["tool"],["is"],["sensitive"],["CCCCCC"]);
return ;
}
知识点讲解:
对于数组中的元素,最常见的表示方法是:地址[偏移],如a[0],a[1],a[2]。
还有一种不常见的表示方法是:偏移[地址],如0[a],1[a],2[a]。
举例:
#include <stdio.h>
int main()
{
int a[] = {, , };
printf(“%d, %d, %d\n”, [a], [a], [a]);
return ;
}
运行结果为:0, 1, 2
printf(“%d, %d, %d\n”, 0[a], 1[a], 2[a]);
等效于
printf(“%d, %d, %d\n”, a[0], a[1], a[2]); 题目讲解:
printf(&a["Ya!Hello! how is this? %s\n"], &b["junk/super"]);
等效于
printf("Hello! how is this? %s\n", "super"); printf(&a["WHAT%c%c%c %c%c %c !\n"], 1["this"],
2["beauty"],0["tool"],0["is"],3["sensitive"],4["CCCCCC"]);
等效于
printf("T%c%c%c %c%c %c !\n", ‘h’,‘a’,’t’,’i’,’s’,’C’);
第四十题
What is the output of the following, if the input provided is:
Life is beautiful
#include <stdio.h>
int main()
{
char dummy[];
printf("Enter a string:\n");
scanf("%[^a]",dummy);
printf("%s\n",dummy);
return ;
}
知识点讲解:
scanf格式控制符:
%[...]:读取字符串,直到遇到不是[]中的字符;
%[^...]:读取字符串,直到遇到[]中的字符。
如:
scanf("%[a-z]",dummy);输入为”abc123”时,dummy为”abc”;
scanf("%[^a-z]",dummy);输入为”123abc”时,dummy为”123”;
题目讲解:
“%[^a]”表示读取字符串,直到遇到字符’a’。所以当输入为”Life is beautiful”时,dummy为”Life is be”。
第四十一题
Note : This question has more to do with Linker than C language
We have three files a.c, b.c and main.c respectively as follows:
a.c
---
int a;
b.c
---
int a = ;
main.c
------
extern int a;
int main()
{
printf("a = %d\n",a);
return ;
}
Let's see what happens, when the files are compiled together:
bash$ gcc a.c b.c main.c
bash$ ./a.out
a =
Hmm!! no compilation/linker error!!! Why is it so??
知识点讲解:
参考《C陷阱与缺陷》第67页 4.2 申明与定义。
若一个文件中定义int a,另一个文件中定义int a,编译不会有问题,编译器将a初始化为0;
若一个文件中定义int a,另一个文件中定义int a=10,a的值为10;
若一个文件中定义int a=1,另一个文件中定义int a=10,编译会有重复定义的错误。
第四十二题
The following is the offset macros which is used many a times. Figure out what is it trying to do and what is the advantage of using it.
#define offsetof(a,b) ((int)(&(((a*)(0))->b)))
知识点讲解:
计算结构体成员变量在结构体中的偏移。a为结构体类型,b为成员变量。
第四十三题
The following is the macro implementation of the famous, Triple xor swap.
#define SWAP(a,b) ((a) ^= (b) ^= (a) ^= (b))
What are the potential problems with the above macro?
知识点讲解:
参考博文:http://www.cnblogs.com/tanghuimin0713/p/3220665.html的评论。
此方法有如下局限:
1)a和b不能是同一个变量,即如果执行SWAP(a, a)那么不管原来a值是多少,执行后a值被置为0;
2)a和b不能是浮点数,异或操作对浮点数没有意义;
3)a和b不能是结体体等复合数据类型,原因同上;
4)a或b不能是表达式;
第四十四题
What is the use of the following macro?
#define DPRINTF(x) printf("%s:%d\n",#x,x)
题目讲解:
打印x的值。
如a=10,DPRINTF(a)的结果为“a:10“。
第四十五题
Let's say you were asked to code a function IAddOverFlow which takes three parameters, pointer to an integer where the result is to be stored, and the two integers which needs to be added. It returns 0 if there is an overflow and 1 otherwise:
int IAddOverFlow(int* result,int a,int b)
{
/* ... */
}
So, how do you code the above function? (To put in a nutshell, what is the logic you use for overflow detection?)
题目讲解:
检测溢出的方法参考:http://www.fefe.de/intof.html
C puzzles详解【38-45题】的更多相关文章
- C puzzles详解【51-57题】
第五十一题 Write a C function which does the addition of two integers without using the '+' operator. You ...
- C puzzles详解【46-50题】
第四十六题 What does the following macro do? #define ROUNDUP(x,n) ((x+n-1)&(~(n-1))) 题目讲解: 参考:http:// ...
- C puzzles详解【34-37题】
第三十四题 The following times. But you can notice that, it doesn't work. #include <stdio.h> int ma ...
- C puzzles详解【31-33题】
第三十一题 The following is a simple C program to read and print an integer. But it is not working proper ...
- C puzzles详解【26-30题】
第二十六题(不会) The following is a simple program which implements a minimal version of banner command ava ...
- C puzzles详解【21-25题】
第二十一题 What is the potential problem with the following C program? #include <stdio.h> int main( ...
- C puzzles详解【16-20题】
第十六题 The following is a small C program split across files. What do you expect the output to be, whe ...
- C puzzles详解【13-15题】
第十三题 int CountBits(unsigned int x) { ; while(x) { count++; x = x&(x-); } return count; } 知识点讲解 位 ...
- C puzzles详解【9-12题】
第九题 #include <stdio.h> int main() { float f=0.0f; int i; ;i<;i++) f = f + 0.1f; if(f == 1.0 ...
随机推荐
- Mac 终端常用命令备忘
Tab 补全 pwd 显示路径 一 .ls ls -lh 查看当前路径详细文件 ls .. 返回上级目录 ls -a 显示隐藏文件 ls -a -l 以详细列表显示 ls ../../ ...
- 专注于提高“人肉测试”效率,Bugtags已完成600万元天使轮融资
导语:近日,专注于移动测试的缺陷发现及管理工具“Bugtags”创始人张磊独家透露,Bugtags已完成600万元天使轮投资,投资方为高捷资本. 近日,专注于移动测试的缺陷发现及管理工具“Bugtag ...
- 新找到的一款字体 fantasque-sans-mono
http://www.ipreferjim.com/2015/03/your-ides-font-matters-fantasque-sans-mono/
- Java中的Comparable<T>和Comparator<T>接口
有的时候在面试时会被问到Comparable<T>和Comparator<T>的区别(或者Java中两种排序功能的实现区别). 1) 在使用普通数组的时候,如果想对数据进行排序 ...
- php中检查文件或目录是否存在的代码小结
检查文件或目录是否存在 ,我们使用了php中常用的函数file_exists,这个函数就可以实现我想要的功能,下面大家慢慢参考一下下面是一个简单的检查文件是否存在的实例代码: <?php $fi ...
- 菜鸟-手把手教你把Acegi应用到实际项目中(4)
今天就讲个ConcurrentSessionFilter. 在Acegi 1.x版本中,控制并发HttpSession和Remember-Me认证服务不能够同时启用,它们之间存在冲突问题,这是该版本的 ...
- HDU 4407 Sum 容斥原理
Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Desc ...
- 在 ASP.NET MVC 应用中使用 NInject 注入 ASMX 类型的 Web Service
这几天,有同学问到为什么在 ASP.NET MVC 应用中,无法在 .ASMX 中使用 NInject 进行注入. 现象 比如,我们定义了一个接口,然后定义了一个实现. public interfac ...
- MAC 下用GCC编译报错:“Undefined symbols for architecture x86_64: ”
解决方法: 因为GCC编译的时候没有链接C++ standard library, 因此在编译的时候要加入符号 -lstdc++ 使用命令: gcc myprog.c -o myprog -lstdc ...
- SVN+FTP服务器搭建(一)——SVN安装配置篇
Subversion是一个自由,开源的版本控制系统.在Subversion管理下,文件和目录可以超越时空.Subversion将文件存放在中心版本库里.这个版本库很像一个普通的文件服务器,不同的是,它 ...