1、隐式函数错误一般原因

写驱动的时候经常遇到报隐式函数的报错,很麻烦,查找了很多原因,一般是函数拼写错误。

2、system命令导致系统问题

system会导致系统出现严重的性能消耗,如果在程序中调用,需要单独开启一个线程进行使用,否则会生不可知错误。

3、结构体易错点

3-1、第一个易错点

采用memset函数初始化结构体,全部成员变量的值清零。

1
2
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
2
struct st_girl queen;
struct st_girl *pst=& 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
2
void *memcpy(void *dest, const void *src, size_t n);

参数说明:

src 源内存变量的起始地址。

dest 目的内存变量的起始地址。

n 需要复制内容的字节数。

函数返回指向dest的地址,函数的返回值意义不大,程序员一般不关心这个返回值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

/*
* 程序名:book94.c, 此程序演示采用memcpy函数复制结构体
* 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>
#include <string.h>

struct st_girl
{
char name[50]; // 姓名
int age; // 年龄
};

void main()
{
struct st_girl girl1,girl2;

strcpy(girl1.name,"西施"); // 对girl1的成员赋值
girl1.age=18;

// 把girl1的内容复制到girl2中
memcpy(&girl2,&girl1,sizeof(struct st_girl));

printf("girl1.name=%s,girl1.age=%d\n",girl1.name,girl1.age);
printf("girl2.name=%s,girl2.age=%d\n",girl2.name,girl2.age);
}

可能想起了strcpy函数,与memcpy有相似之处,实际上这两个函数从功能和实现原理上完本不同,甚至不应该放在一起比较。

1)复制的内容不同,strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。

2)用途不同,通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy。

3)复制的方法不同,strcpy不需要指定长度,它遇到被复制字符的串结尾符0才结束,memcpy则是根据其第3个参数决定复制的长度.

4、变量,函数等命名

函数,变量命名长度有限制,超过限制通常报未定义错误。