c语言代码简单陷阱
来源:互联网 发布:mac声音调节快捷键 编辑:程序博客网 时间:2024/06/05 19:27
#define _CRT_SECURE_NO_WARNINGS#include <stdlib.h>#include <stdio.h>#include <string.h>void GetMemory(char *p){p = (char *)malloc(100);}void GetMemory2(char **p){*p = (char *)malloc(100);}//传入中GetMemory(char *p)函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的值,执行完后的str仍然为NULL;void Test(void){//代码陷阱1char *str = NULL;GetMemory(str);strcpy(str, "hello world");printf(str);free(str);}void Test2(void){char *str = NULL;GetMemory2(&str);strcpy(str, "hello world");printf(str);free(str);}//代码陷阱char *GetMemory(void){//p[]数组为函数内的局部自动变量,在函数返回后,内存已经被释放。这是许多程序员常犯的错误,其根源在于不理解变量的生存期char p[] = "hello world";return p;}void Test3(void){char *str = NULL;str = GetMemory();printf(str);}void GetMemory4(char **p, int num){/**1.未判断内存是否申请成功,应加上:if ( *p == NULL ){//进行申请内存失败处理}*/*p = (char *)malloc(num);}void Test4(void){char *str = NULL;GetMemory4(&str, 100);strcpy(str, "hello");printf(str);// printf(str) 改为 printf("%s",str),否则可使用格式化 字符串攻击//未释放堆内存 free(str); str=NULL;}#define MAX_LEN 256void LoopMove(char *pStr, int steps){int n = strlen(pStr) - steps;char tmp[MAX_LEN];memcpy(tmp, pStr + n, steps);memcpy(pStr + steps, pStr, n);memcpy(pStr, tmp, steps);}/**static关键字至少有下列n个作用:(1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;(2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;(3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;(4)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。const关键字至少有下列n个作用:(1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;(2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;(3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;(4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的 成员变量;(5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。例如:const classA operator*(const classA& a1,const classA& a2);operator*的返回结果必须是一个const对象。如果不是,这样的变态代码也不会编译出错:classA a, b, c;(a * b) = c; // 对a*b的结果赋值操作(a * b) = c显然不符合编程者的初衷,也没有任何意义。 */int checkCPU(){{union w{int a;char b;} c;c.a = 1;return (c.b == 1);}}//https://www.nowcoder.com/ta/review-c/review?tpId=22&tqId=21050&query=&asc=true&order=&page=1int main(){//Test();Test2();printf("\n");Test3();printf("\n");Test4();printf("\n");char line[20] = "abcdefghi";LoopMove(line, 2);printf("%s\n",line);checkCPU();system("pause");}
0 0
- c语言代码简单陷阱
- C语言陷阱
- c 语言陷阱
- c 语言陷阱
- C语言 陷阱
- C语言陷阱---丢三落四
- c语言数据类型陷阱
- C语言---strlen陷阱
- C语言控制台简单代码!
- C语言陷阱和缺陷
- C语言陷阱和缺陷
- C语言:陷阱和缺陷
- C语言:陷阱和缺陷
- C语言陷阱和缺陷
- C语言:陷阱和缺陷
- C语言陷阱和缺陷
- C语言陷阱和缺陷
- C语言缺陷与陷阱
- POSIX 线程详解
- eclipse快捷键(方便自己记忆)
- Android studio快捷键
- 持续可用与CAP理论 – 一个系统开发者的观点
- Android 设置定时提醒,AlarmManager简单使用
- c语言代码简单陷阱
- 错误集锦
- 同步/异步与阻塞/非阻塞的区别
- 从路径uri加载Bitmap,缩小图片到指定大小的方法记录
- CCF201604-3 路径解析(100分)
- RunLoop优化加载大量图片的卡顿问题
- 第七节 Html字体样式
- restful
- 分布式系统的事务处理经典问题及模型