1.*ptr + 2 为地址后移两位的意思,类似于ptr[2]。注意编码时候如果数值自增要(*ptr)++。
2.函数设计时,内部的static变量生命周期是全局的,会影响函数的可重入性。所以关于"只要是定义在函数中的变量,变量生命周期都是本函数的,不影响函数可重入性。"的说法是错误的。
3. memmove_s函数可以安全地在重叠内存地址之间复制数据;memcpy_s肯定不行,因为restrict修饰符的修饰,上篇笔记说过这个事。
4. sprintf函数是将格式化数据写入字符串的函数。与printf类似,不同的是printf是写人屏幕。其定义如下。第一个参数为输出的字符串,必须有,否则会报非法操作。因为没输入数组长度,如果str长度不够,就会造成缓冲区溢出。
int sprintf(char *str, char * format [, argument, ...]);
strcpy函数定义如下,是将src指向的字符串复制到dest,不能复制内存地址重叠的数据。可能会造成缓冲区溢出。
char *strcpy(char *dest, const char *src)
5.局部变量的地址被返回的函数是错的。调用了这种函数,无法预测会发生什么。
int *Sum(int a, int b)
{
int s = a + b;
return &s;
}
6.指向某类型的指针,对该指针进行加减操作,地址的变化以指针的类型的大小为单位。所以对于一个char* 指针ptr如果指向一个int的变量,想让指针指向下一个char,则需要prt += 4。char为1字节,int为4字节,short为2个字节,任何指针都是4个字节。
7.循环队列计算元素个数的公式为:(尾-头+表长)%表长。队空的判断条件:front = rear。队满的判断条件为front = (rear + 1) % MAXSIZE具体解释见知乎文章:打开。
8.C语言中左移<< 与右移>> 多少位表示乘以或除以2的多少次方。但int类型由于最高位是符号位,左移动会造成溢出。
9.rand函数生成的是伪随机数。是根据一个数(种子)为基准以某个递推公式推算出来的。一般rand函数要搭配srand函数,srand函数用来随机生成种子,如果没有它,那种子默认就是1,那么rand函数每次产生的随机数序列都是相同的。因为其伪随机数,不能用于有安全性要求的功能上去。
10.realpath函数用来将参数path所指的相对路径转换成绝对路径后存于参数resolved_path所指的字符串数组或指针中。可能会造成缓存区溢出。
char *realpath(const char *path, char *resolved_path)
11.两个不同类型的数据比大小时候,有符号位的会转变为无符号位,会出现-1比1大的情况。
12.程序中全局可以访问的信息,使用全局变量/堆内存中的变量/static变量均可以实现,并不是只能使用全局变量保存。
13.SQL注入是关于C安全编码规范方面的问题,需要防止SQL注入,可以采用参数化查询,对外部数据校验,对外部SQL特殊字符转义等方式。其中外部数据校验要采用白名单、