C常见错误小记(未完)
1、指针与NULL
下面这段代码会报错:
{
int *a = NULL;
*a = ;
printf("%d",*a);
}
指针初始化为NULL,还是没有分配内存,所以会报错。指针是个变量,就是个装地址的变量,是变量就可以重复使用。
而平时之所以让指针指向NULL,是防止误用了野指针修改随机内存。但具体使用前一定要保证已分配内存了。
2、NDEBUG与assert
头文件assert.h定义的宏受NDEBUG的影响.如果预程序在处理这个头文件时已经定义了NDEBUG,assert宏的内容就定义为空,这意味着assert宏不在起作用.所以,可以在最终发布程序的时候可以使用-DNDEBUG关闭断言功能或者把#define NDEBUG加到每个源文件中,但这条语句必须放在#include <assert.h>之前.
#include<stdio.h>
#define NDEBUG //要加在#include<assert.h>前面 #include<assert.h>
int main()
{
int x = ;
assert(x);
printf("aa\n"); return ;
}
trace(),assert()都只是在DEBUG的模式下才起作用的,如果定义了NDEBUG,编译器会认为是非DEBUG的模式(虽然编译出来的程序还是很大,而且还可以进行调试),此时trace(),assert()就没有用了.就如同你编译成release版的时候这些没有用一样。efine DEBUG 会重新打开调试开关
3、作用域与static、extern
举个例子,同一个工程下:
(1)在file.c中定义全局变量int a = 9,则在file2.c中不允许在全局下重定义变量a,但允许在语句"extern int a;"后可以访问file.c中的a。
(2)在file.c中定义全局变量static int a = 9,则a为file.c的文件作用域,在file2.c中无法访问。
4、不要写歧义的操作
比如下面这句话,对n的操作有歧义,究竟是左值中的n是n+1还是n呢?
ThreadHandle[n]=CreateThread( NULL, , comp, &varr[n++], , NULL );
类似的,f1()*f2()中,哪个先计算呢,在C++中,规定操作数计算顺序的的只有(), ?: 和 , ,此外其他操作符并未指定操作数的求值顺序,这类表达式的行为没有明确定义。
所以若操作数计算顺序会影响结果,最好可以写成更清晰地形式
ThreadHandle[n]=CreateThread( NULL, , comp, &varr[n], , NULL );
n++; //不要把n的操作放在上面的表达式中,有歧义,易出错
C常见错误小记(未完)的更多相关文章
- DateGridew导出Excel表+常见错误提示
在敲机房收费系统的时候,显示数据的时候需要将DateGridew 中的数据导出进Excel表.DateGridew导出Excel表是比较常见的,当然导出Excel表有很多种方法,下面是个人认为比较容易 ...
- 开发常见错误解决(6)WSE3.0未处理的WebException,未处理的Web异常,基础连接以及关闭...
开发常见错误解决(6)WSE3.0未处理的WebException,未处理的Web异常,基础连接以及关闭. 我们在调试WSE服务端服务的时候会抛出,未处理的Web异常,基础连接以及关闭的异常信息.如图 ...
- .Net常见错误
常见错误 #1: 把引用当做值来用,或者反过来 C++ 和其他很多语言的程序员,习惯了给变量赋值的时候,要么赋单纯的值,要么是现有对象的引用.然而,在C# 中,是值还是引用,是由写这个对象的程序员决定 ...
- Shell常见用法小记
shell的简单使用 最近发现shell脚本在平常工作中简直算一把瑞士军刀,很多场景下用shell脚本能实现常用的简单需求,而之前都没怎么学习过shell,就趁机把shell相关的语法和常见用法总结了 ...
- Servlet(三):生命周期、常用方法、常见错误
Servlet的生命周期:从第一次调用,到服务器关闭.如果在web.xml 中配置了load-on-startup则是从服务器开启到服务器关闭. 注意: * init方法是对Servlet进行初始化的 ...
- C#基础(202)--类定义,字段与属性,自动属性,方法及常见错误
c#类的定义规范 字段与属性的比较: 字段: 字段主要是为类的内部做数据交换交互使用,字段一般是private 字段可以赋值,也可以取值 当字段需要为外部数据提供数据的时候,请将字段封装为属性,而不是 ...
- Go web编程学习笔记——未完待续
1. 1).GOPATH设置 先设置自己的GOPATH,可以在本机中运行$PATH进行查看: userdeMacBook-Pro:~ user$ $GOPATH -bash: /Users/user/ ...
- postfix 邮箱设置及常见错误
postfix 邮箱设置及常见错误 1.如果装了sendmail的话,先卸载了. yum remove sendmail 2.安装 Postfix yum install postfix 3.更改默认 ...
- GO 新开发者要注意的陷阱和常见错误
转自:http://colobu.com/2015/09/07/gotchas-and-common-mistakes-in-go-golang/ 初级 开大括号不能放在单独的一行 未使用的变量 未使 ...
随机推荐
- ubuntu18.04.4安装k8s
k8s部署 1.集群所有主机关闭swap sudo swapoff -a sudo sed -i 's/.*swap.*/#&/' /etc/fstab 如果重启后swap还是自动挂载执行sy ...
- java对数据库性能测试
package com.mysql; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepar ...
- 编辑器、编译器、文件、IDE等常见概念辨析
一.编辑器与编译器 1.编辑器与编译器有什么区别? 简单讲,编译器就是将"一种语言(通常为高级语言)"翻译为"另一种语言(通常为低级语言)"的程序.一个现代编译 ...
- 新来的老大,剑走偏锋,干掉AOP做操作日志,实现后我们都惊呆了
前言 用户在操作我们系统的过程中,针对一些重要的业务数据进行增删改查的时候,我们希望记录一下用户的操作行为,以便发生问题时能及时的找到依据,这种日志就是业务系统的操作日志. 本篇我们来探讨下常见操作日 ...
- html5学习之路_007
CSS概述 CSS指层叠样式表 CSS样式表极大地提高了工作效率 CSS基础语法 selector { property:value } 例:hi {color:red; font-size:14px ...
- cordova开发插件,并在android studio中开发、调试
之前用过cordova Lib包装H5页面,自己写插件,但做法是野路子,不符合cordova插件的开发思路,这次项目又需要包装H5页面,同时需要自定义插件.所以又折腾了一次cordova自定义插件. ...
- Linux以指定用户非root用户运行程序、进程
方式一: 使用su命令切换用户运行 su 用户名 方式二: useradd -s /sbin/nologin -M test -s /sbin/nologin表示创建一个禁止登陆的用户(比如www ...
- matlab单目相机标定——标定步骤以及参数含义
参考博客园的一篇文章: https://www.cnblogs.com/flyinggod/p/8470407.html#commentform
- Matlab矩阵学习一 矩阵的创建
Matlab矩阵创建 1.直接输入数值创建 矩阵元素要用[ ] 括起来,";"代表一行结束,以下创建方式也是合法的,矩阵的元素可以是实数,也可以是复数,复数用a+bi表 ...
- Rocket - diplomacy - NodeImp
https://mp.weixin.qq.com/s/HgUpTCh0D94Uymj5qQk-ag 介绍NodeImp相关基础类的实现. 1. 类图 节点实现(NodeImp ...