lingshi c注意事项

 

  • 堆区:手动在堆区创建的数据要手动释放;且指向堆区的指针要赋值位空;
  • 给堆区开辟的空间赋值字符串,使用strcpy()函数进行赋值;
  • 指针本身也是放在栈区,但是指针指向的内容放在堆区;
  • 如果主调函数中没有给指针分配内存,被调函数中的同级指针是修饰不到主调函数中的指针的,需要使用更高一级的指针才能修饰到;
  • 数据区放的是静态变量,全局变量和常量
  • static静态变量值初始化一次,在编译阶段就分配了内存,属于内部链接属性,只能在本文件中使用;
  • 静态局部变量和静态变量声明周期一样;
  • 全局变量在c语言下都隐藏增加了extern关键字,属于外部链接属性;使用前都需要使用extern声明;
  • const修饰的全局变量是放在常量区的,收到系统的保护,即使代码编译没有问题,使用指针也无法间接修改;
  • const修饰的局部变量是放在栈中的,是伪常量,使用指针间接可以修改;
  • 伪常量无法初始化数组;
  • *p++是从右往左结合,指针先加一,再指向指针位移后所指向的内容;
  • p++让指针位移,如果指针是int类型指针,则位移4个字节;
  • (*p)++ 是指针所指向的内容加一,改变了数据内容;
  • 数组名是数组的首地址,是一个常量;
  • char*str="hello " 为字符串常量存放在常量区;
  • char str[10] = "hello" 为字符串变量,存放在栈区;
  • 使用宏函数要注意保证运算的完整性;
  • 函数调用惯例内容:出栈方,函数参数的传递顺序,函数名的修饰;c/c++下默认的调用惯例是cdecl;
  • 当指针使用后没有释放,或者指针的操作超越了作用于,就会产生野指针;
  • 指针的步长:01)指针变量+1后,跳跃的字节数量;02)解引用的时候取的字节数;
  • 自定义数据类型(结构体)的成员的偏移量:01)手动计算,要考虑到内存对齐以及成员数据类型的大小;02)使用offsetof()头文件<stddef.h>直接计算偏移量;计算偏移量是要把结果强转成(char*)类型
  • 使用sprintf()格式化字符串;
  • calloc堆区分配内存,会将分配的内存初始化为0;
  • relloc重新再堆区分配内存,01)如果原空间后面有足够打的内存,则直接再原空间后继续开辟内存,返回空间的首地址;02)如果原空间后没有足够的内存,则重新开辟一块足够打的内存,并将原空间的数据拷贝到新开辟的空间,释放原空间,将新空间的首地址返回;
  • 数组作函数参数int*arr等价于int arr[];
  • arr[i] 等价于 *(arr+i)匿名;
  • sizeof(数组名)其实是计算整个数组的字节数;
  • 数组名本质并不是指针:两种特殊情况:01)对数组名进行sizeof(),02)对数组名取地址,获取的指针步长是整个数组的长度;除了这两种情况外,都是指向数组的首元素的地址;
  • 数组名--指针常量,指针的指向不可以修改;访问数组元素时下标可以时负数;
  • 数组指针是一个指针,它指向一个数组;
  • 内存对齐:cpu是以块的方式读取内存的,块的大小为2的n次方大小,如果没有内存对齐,cpu有些时候会需要二次访问内存才能彻底读取到所有数据,使用内存对齐,是以空间换时间;
  • 内存对齐规则:01)对于内置数据类型,要存放到该类型的整数倍的内存位置;02)对于自定义的数据类型,如结构体,规则如下:1.从第一个属性开始,偏移0;2.从第二个属性开始,地址要放在(该类型整数倍与对齐模数比)中区最小值的整数倍上;3.所有属性计算结束后,整体需要放在在(属性中最大类型和对齐模数比)中取最小值的整数倍上;
  • 使用#pragma pack(show)头文件获取系统的内存对齐模数,也可以使用它改变内存的对齐模数比;
  • c语言中使用%6.3f输入时间为秒,使用difftime()计算时间差;
  • 栈区注意事项:不要返回局部变量的地址;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值