错误总结
1、隐式函数错误一般原因
写驱动的时候经常遇到报隐式函数的报错,很麻烦,查找了很多原因,一般是函数拼写错误。
2、system命令导致系统问题
system会导致系统出现严重的性能消耗,如果在程序中调用,需要单独开启一个线程进行使用,否则会生不可知错误。
3、结构体易错点
3-1、第一个易错点
采用memset函数初始化结构体,全部成员变量的值清零。
1 | memset(&queen,0,sizeof(struct st_girl)); |
注意事项,如果把一个结构体的地址传给子函数,子函数用一个结构体指针(如struct st_girl *pst)来存放传入的结构体的地址,那么,在子函数中只能用以下方法来初始化结构体:
1 | memset(pst,0,sizeof(struct st_girl)); |
不能用以下方法来初始化结构体:
1 | memset(pst,0,sizeof(pst)); |
因为子函数中用sizeof(pst),得到的不是结构体占用内存的字节数,而是结构体指针变量占用内存的字节数(8字节)
3-2、第二个易错点
结构体是一种自定义的数据类型,结构体变量是内存变量,有内存地址,也就有结构体指针。
在指针章节中我们已经学习过,采用不同数据类型的指针指向不同数据类型的变量的地址,这一规则也适用于结构体。如下:
1 | struct st_girl queen; |
通过结构体指针可以使用结构体成员,一般形式为:
1 | (*pointer).memberName |
或者:
1 | pointer->memberName |
第一种写法中,圆点.的优先级高于,(pointer)两边的括号不能少。如果去掉括号写作pointer.memberName,那么就等效于(pointer.memberName),这样意义就完全不对了。
第二种写法中,->是一个新的运算符,习惯称它为“箭头”,有了它,可以通过结构体指针直接使用结构体成员;这也是->在C语言中的唯一用途。
上面的两种写法是等效的,程序员通常采用后面的写法,这样更加直观。
3-3、第三个易错点
在C语言中,结构体的成员如果是基本数据类型(int、char、double)可以用=号赋值,如果是字符串,字符串不是基本数据类型,可以用strcpy函数赋值,如果要把结构体变量的值赋给另一个结构体变量,有两种方法:1)一种是把结构体变量成员的值逐个赋值给另一个结构体变量的成员,这种方法太笨,没人使用;2)另一种方法是内存拷贝,C语言提供了memcpy(memory copy的简写)实现内存拷贝功能。
1 | void *memcpy(void *dest, const void *src, size_t n); |
参数说明:
src 源内存变量的起始地址。
dest 目的内存变量的起始地址。
n 需要复制内容的字节数。
函数返回指向dest的地址,函数的返回值意义不大,程序员一般不关心这个返回值。
1 |
|
可能想起了strcpy函数,与memcpy有相似之处,实际上这两个函数从功能和实现原理上完本不同,甚至不应该放在一起比较。
1)复制的内容不同,strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2)用途不同,通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy。
3)复制的方法不同,strcpy不需要指定长度,它遇到被复制字符的串结尾符0才结束,memcpy则是根据其第3个参数决定复制的长度.
4、变量,函数等命名
函数,变量命名长度有限制,超过限制通常报未定义错误。