第37节 面试题分析
-------------------------------------资源来源于网络,仅供自学使用,如有侵权,联系我必删.
第一:
指针运算
必考知识点
#include <stdio.h>
//二维数组名代表 数组首元素
//二维数组是以一维数组存在的
//指针运算
void main()
{
int TestArray[5][5] = { {11,12,13,14,15},
{16,17,18,19,20},
{21,22,23,24,25},
{26,27,28,29,30},
{31,32,33,34,35}
};
//TestArray[5][5]的位置
int* p1 = (int*)(&TestArray + 1);
//TestArray + 1 数组第二个位置
//*(TestArray + 1) 数组第二个位置({16,17,18,19,20})的地址
// (*(TestArray + 1) + 6) 16是第0位,向后移6位是22
int* p2 = (int*)(*(TestArray + 1) + 6);
//*TestArray 代表数组{11,12,13,14,15} ; *(*TestArray) 代表11
//*(*(TestArray + 1)) 代表 16
//TestArray + 3 代表 {26,27,28,29,30} ; *(TestArray + 3) + 3 代表 29的地址
//p1代表{31,32,33,34,35} p1[-8]代表35向后数8位 是 27
//p2代表22;p2[4]向后移4位 是 26
printf("Result: %d; %d; %d; %d; %d\n", *(*TestArray), *(*(TestArray + 1)),
*(*(TestArray + 3) + 3), p1[-8],
p2[4]);
}
第二:
调试经验
#include<stdio.h>
void main()
{
char* p = "hello world!";
int a = (int)p;
short s = 'c';
//int printf (const char *__format, ...) 可变参数
//可变参数宏无法判断参数的实际类型
printf("%c\n", (long)(*((int*)p)));//%c只取一个字节 那就只取字符串第一个字节h
printf("%s\n", a); //%s a代表字符串首地址
printf("%s\n", &s); //short类型2个字节 c 0 为字符串
}
第三:
安全编程
#include<stdio.h>
int main(int argc, char *argv[])
{
int flag = 0;
char passwd[10]; //这里字符串预定义只有10位
memset(passwd,0,sizeof(passwd));
strcpy(passwd, argv[1]); //strcpy函数有可能存在 数组越界 !!!!
//strncpy(passwd, argv[1],9); //带n的字符串安全性较高
if(0 == strcmp("LinuxGeek", passwd))
{
flag = 1;
}
if( flag )
{
printf("\n Password cracked \n");
}
else
{
printf("\n Incorrect passwd \n");
}
return 0;
}