C语言编程注意事项3.0

常见的内存错误及对策

 

1、结构体成员指针未初始化

struct student

{

char *name;

int score;

}stu, *pstu;

 

int main1()

{

//stu.name =(char *)malloc(sizeof(char)) ;

strcpy(stu.name, "Jimy");

stu.score = 99;

return 0;

}

 

int main2()

{

pstu = (struct student *)malloc(sizeof(struct student));

//pstu->name =(char *)malloc(sizeof(char)) ;

strcpy(pstu->name, "JImy");

pstu->score = 99;

free(pstu);

return 0;

}

 

 

  在定义结构体变量stu和结构体指针pstu时,只是给name这个指针变量本身分配了4字节,name指针并没有指向一个合法的地址,在访问name指针指向的地址时就会出错;

 

2、没有为结构体指针分配足够的内存

int main()

{

pstu = (struct student *)malloc(sizeof(struct student*));//sizeof(struct student

strcpy(pstu->name, "JImy");

pstu->score = 99;

free(pstu);

return 0;

}

 

  为pstu分配内存时,分配到内存大小不合适;

 

3、函数入口校验

 

4、为指针分配的内存大小

  字符串结尾'\0'不能忘算

 

5、慎用未初始化的变量,像指针变量定义好后可以先初始化为NULL;

 

6、内存越界

  这种错误经常是由于操作数组或指针时出现“多1”或“少1”而出现的,比如:

int a[10] = {0};

 

for (i = 0; i<=10; i++)

{

a[i] = i;

}

 

所以for循环尽量使用半开半闭区间,而且尽量从0开始;

 

7、内存释放之后

  使用free函数释放空间后,指针变量本身保存的地址并没有改变,那就需要重新把p的值变为NULL;

  NULL指针连续free多次不会出错:

空指针:空指针是一个特殊的指针值,也是唯一一个对任何指针类型都合法的指针值。指针变量具有空指针值,表示它当时处于闲置状态,没有指向有意义的东西。C语言保证这个值不会是任何对象的地址。给指针值赋零则使它不再指向任何有意义的东西。

通用指针:通用指针,它可以指向任何类型的变量。通用指针的类型用(void *)表示,因此也称为void 指针。

野指针:野指针也就是指向不可用内存区域的指针。通常对这种指针进行操作的话,将会使程序发生不可预知的错误。

 

8、内存已被释放,但继续通过指针来使用:

  free后继续通过p指针来访问内存:给p置NULL;

  函数返回栈内存,比如在函数内部定义了一个数组,却用return返回指向该数组的指针:了解栈上变量的生命周期;

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言编程注意事项 1. 每个程序中一定包含main()函数, 尽管C语言中对函数命名没有限制。 2. printf函数永远不会自动换行, 只能用\n来实现, 回车键进行的换行在编译中会出现错误信息。 3. 在vs2008等平台中编译、测试要加 system("pause"); 来暂停dos自动退出引起的printf无法显示。 4. 所有自定义变量必须声明才能使用。 5. 每行一般只写一条语句, 在运算符两边加一个空格, 便于阅读。 6. 整数除法将会自动舍位, 不进行四舍五入的操作。 7. for(初始化部分;条件部分;增长部分) 比while 更适用于初始化和增长步长都是单条语句的情况。 8. 使用 #define 名字替换文本对部分"幻数" 赋予意义便于阅读 #define结尾无需;号来结束。 9. EOF(end of file)表示没有字符输入时定义在stdio.h 头文件中 EOF不等于\n 换行等。 10. 由于!= 的优先级大于 = ,因此如果对判断中存在变量赋值时 应对赋值加() 例如: while((c = getchar()) != EOF)。 11. getchar() 用于用户输入直至键入回车键。 12. 变量名以字母和数字组成, (下划线"_"被默认为字符, 以下划线为首写字母的为库类变量名), 变量常以小写字母开头,内部变量名前31位有效, 外部变量名至少前6位保持唯一性。 13.在C语言中是区分字母大小写的。 14. 一个字符常量为一个整数, 用''单引号括起来。例如: '0' 为48, 它与0没有任何关系。 15. ANSI C语言的转义符: \a 响铃符; \b 回退符; \f 换页符; \n 换行符; \r 回车符; \t 横向制表符 ; \v 纵向制表符; \\ 反斜杠; \? 问号; \' 单引号; \" 双引号; \ooo 八进制数; \xhh 十六进制数; '\0' 表示0, 即(null)。 16. 'x'与"x"的区别: 'x'表示一个整数, 字母x在其字符集中对应的数值, "x"表示包含一个字符x 以及一个结束符'\0'。 17. const在声明变量中起限制作用, 该限定变量的值不能被修改。 18. %运算符不能应用于float或double类型。 19. char类型转换为int型时, 因为无法判断它是signed还是unsigned,这样其结果有可能为负数, 所以转换时尽量指定signed和unsigned限制符。 20. ++i与i++ 的不同之处: ++i是先 +1再使用i, i++ 是先使用i再 +1。 21. 三元运算符"?:" 第一个表达式的括号不是必须的, 但是由于三元表达式的优先级非常低, 因此我们还是将第一个表达式用()括起来以便于阅读和理解。 22. C语言中可以使用递归 (即函数调用自身函数), 这样做并不节省储存空间也不加快执行速度, 只是使程序紧凑便于理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值