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=0; i<SIZE; i++)
          *(a + i) = i * i;
      for (i=0; i<SIZE; i++)
          printf("%d\n", *a++);
      free(a);
      return 0;
  }
题目讲解:
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=3, b = 5;

    printf(&a["Ya!Hello! how is this? %s\n"], &b["junk/super"]);
    printf(&a["WHAT%c%c%c  %c%c  %c !\n"], 1["this"],
       2["beauty"],0["tool"],0["is"],3["sensitive"],4["CCCCCC"]);
    return 0;
  }
知识点讲解:
对于数组中的元素,最常见的表示方法是:地址[偏移],如a[0],a[1],a[2]。还有一种不常见的表示方法是:偏移[地址],如0[a],1[a],2[a]。
举例:
#include <stdio.h>
int main()
{
int a[] = {0, 1, 2};
printf(“%d, %d, %d\n”, 0[a], 1[a], 2[a]);
return 0;
}
运行结果为:0, 1, 2printf(“%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[80];
      printf("Enter a string:\n");
      scanf("%[^a]",dummy);
      printf("%s\n",dummy);
      return 0;
  }
知识点讲解:
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 = 10;
main.c
------
extern int a;
int main()
{
        printf("a = %d\n",a);
        return 0;
}
Let‘s see what happens, when the files are compiled together:
bash$ gcc a.c b.c main.c
bash$ ./a.out
a = 10
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
时间: 2024-08-07 06:14:21

C puzzles详解【38-45题】的相关文章

C puzzles详解【26-30题】

第二十六题(不会) The following is a simple program which implements a minimal version of banner command available on most *nix systems. Find out the logic used in the program. #include<stdio.h> #include<ctype.h> char t[]={ 0,0,0,0,0,0,12,18,33,63, 33

C puzzles详解【51-57题】

第五十一题 Write a C function which does the addition of two integers without using the '+' operator. You can use only the bitwise operators.(Remember the good old method of implementing the full-adder circuit using the or, and, xor gates....) 题目讲解: 参考:ht

C puzzles详解【46-50题】

第四十六题 What does the following macro do? #define ROUNDUP(x,n) ((x+n-1)&(~(n-1))) 题目讲解: 参考:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=814501 用于内存对齐,n为2的幂. 第四十七题 Most of the C programming books, give the following example for the definitio

C puzzles详解【31-33题】

第三十一题 The following is a simple C program to read and print an integer. But it is not working properly. What is(are) the mistake(s)? #include <stdio.h> int main() { int n; printf("Enter a number:\n"); scanf("%d\n",n); printf(&quo

C puzzles详解【34-37题】

第三十四题 The following is a piece of C code, whose intention was to print a minus sign 20 times. But you can notice that, it doesn't work. #include <stdio.h> int main() { int i; int n = 20; for( i = 0; i < n; i-- ) printf("-"); return 0; }

C puzzles详解【16-20题】

第十六题 The following is a small C program split across files. What do you expect the output to be, when both of them compiled together and run? File1.c int arr[80]; File2.c extern int *arr; int main() { arr[1] = 100; return 0; } 题目讲解: 编译完运行发生段错. File1.

C puzzles详解【21-25题】

第二十一题 What is the potential problem with the following C program? #include <stdio.h> int main() { char str[80]; printf("Enter the string:"); scanf("%s",str); printf("You entered:%s\n",str); return 0; } 题目讲解: 易造成数组越界,sca

C puzzles详解【6-8题】

第六题 #include<stdio.h> int main() { int a=10; switch(a) { case '1': printf("ONE\n"); break; case '2': printf("TWO\n"); break; defa1ut: printf("NONE\n"); } return 0; } 题目讲解: “defalut”拼写错误. 注意a为int型,case后的’1’,’2’为char型. 第七

C puzzles详解【13-15题】

第十三题 int CountBits(unsigned int x) { int count=0; while(x) { count++; x = x&(x-1); } return count; } 知识点讲解 位运算 关于位运算的一些例子参考: http://www.ugcs.caltech.edu/~wnoise/base2.html 题目讲解 x&(x-1)常见的两种应用: 1)计算x二进制形式中1的个数,每循环一次,将x二进制形式最右边的1变成0: 2)判断x是否是2的幂,若x&