方位通讯笔试题

请写出下列代码的输出内容?

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));
}
}
答案

15,21,27,33,39,


下面的代码输出是什么,为什么?

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 *) &num;
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 升的水?

答案

方法一:

  1. 先将 5 升水壶倒满,然后倒入 6 升水壶中,此时 6 升水壶装满,5 升水壶中剩余 3 升水;
  2. 然后将 6 升水壶清空,把剩下的 3 升水倒入 6 升水壶中;
  3. 最后从池塘中再取 5 升水放入 5 升水壶中,此时 6 升水壶中就有 3 升水。

方法二:

  1. 先将 5 升水壶倒满,把水倒入 6 升水壶中,此时 6 升水壶中有 5 升水;
  2. 然后将 6 升水壶倒空,把剩余的 5 升水倒入 5 升水壶中,此时 5 升水壶中有 4 升水;
  3. 然后再从池塘中取 1 升水放入 5 升水壶中,此时 5 升水壶中有 5 升水,然后把 5 升水倒入 6 升水壶中,此时 6 升水壶中有 3 升水。