方位通讯笔试题
请写出下列代码的输出内容?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| int sum(int a) { static int b = 3; auto int c = 0; c += b++; a += ++b; return (a + b + c); }
void main() { int i; int a = 2; for (i=0; i<5; i++) { printf("%d,", sum(a)); } }
|
答案
下面的代码输出是什么,为什么?
1 2 3 4 5 6 7 8
| void foo(void) { char a = 127; int sum = 200; a += 1; sum += a; printf("sum=[%d]n", sum); }
|
答案
输出:sum=[328]
因为a经过操作后的值是128,加上200,结果为328。
分析下面的代码
1 2 3 4
| unsigned char *p1; unsigned long *p2; p1=(unsigned char *)0x801000 p2=(unsigned long*)0x810000;
|
请问:
p1+5=;
p2+5=;
答案
p1+5=0x801005
p2+5=0x810020
下面的代码输出是什么,为什么?
1 2 3 4 5 6
| main() { int a[5] (1,2,3,4,5); int * ptr=(int*)(&.a+1); printf(“%d,%d”,*(a+1),*(ptr-1)); }
|
答案
输出:2,5
因为a+1表示数组a中下标为1的元素,也就是2;ptr-1表示ptr指针指向的地址减1,也就是下标为4的元素,也就是5。
下面的代码片段输出是什么,为什么?
1 2 3 4 5
| char *ptr; if ((ptr = (char *)malloc(0)) == NULL) puts("Gota null pointer"); else puts("Gota valid pointer");
|
答案
输出:Gota valid pointer
因为malloc函数可以申请0字节的内存,此时ptr的值是有效的,指向的内存地址也是有效的,所以输出Gota valid pointer。
下面的代码输出是什么,为什么?
1 2 3 4 5 6 7 8 9 10 11 12
| void getMemory(char *p) { p =(char *)malloc(100); strcpy(p, "hello world"); } void main(void) { char *str = NULL; getMemory(str); printf( " % s " ,str); free(str); }
|
答案
输出:(null)
因为在函数getMemory中,指针p指向了堆内存,但是在函数main中,指针str没有指向堆内存,因此指向的内容是空的,printf会输出(null)。
请找出下面代码中的所有错误
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| main() { char* src = "hello,world"; char* dest=NULL; int len=strlen(src); dest=(char*)malloc(len); char* d = dest; char* s = src[len]; while(len--!=0) { d++ = s--; } printf("%s",dest); return 0; }
|
答案
错误1:dest没有分配内存
错误2:src[len]是非法的,应该是src+len
错误3:while循环的判断条件应该是len>0
错误4:d++ = s—是非法的,应该是d++ = s—
编码实现系统大小端字节序的检查函数;要求: 大端字节序返回1,否则返回0。
答案
1 2 3 4 5 6 7 8 9 10 11 12
| #include <stdio.h>
int main() { unsigned int num = 0x12345678; unsigned char *p = (unsigned char *) # if (*p == 0x12) printf("Big Endian\n"); else printf("Little Endian\n"); return 0; }
|
实现一个判断字符串是否是合法IPV4地址的函数:要求:合法IPV4地址返回1,否则返回0.
答案
输出:Gota valid pointer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| bool isIPv4(char* str) { char* tmp = strtok(str, "."); int count = 0; while (tmp != NULL) { int ip = atoi(tmp); if (ip < 0 || ip > 255) { return false; } tmp = strtok(NULL, "."); count++; } if (count == 4) { return true; } else { return false; } }
|
假设有一个池塘,里面有无穷多的水。现有 2 个空水壶,容积分别为5升和 6升。问题是如何只用这2个水壶从池塘里取得 3 升的水?
答案
方法一:
- 先将 5 升水壶倒满,然后倒入 6 升水壶中,此时 6 升水壶装满,5 升水壶中剩余 3 升水;
- 然后将 6 升水壶清空,把剩下的 3 升水倒入 6 升水壶中;
- 最后从池塘中再取 5 升水放入 5 升水壶中,此时 6 升水壶中就有 3 升水。
方法二:
- 先将 5 升水壶倒满,把水倒入 6 升水壶中,此时 6 升水壶中有 5 升水;
- 然后将 6 升水壶倒空,把剩余的 5 升水倒入 5 升水壶中,此时 5 升水壶中有 4 升水;
- 然后再从池塘中取 1 升水放入 5 升水壶中,此时 5 升水壶中有 5 升水,然后把 5 升水倒入 6 升水壶中,此时 6 升水壶中有 3 升水。