一、snprintf函数
1.功能及参数介绍
#include <stdio.h>
int snprintf(char *str, size_t size, char * format [, argument, …]);
功能:将可变参数 “…” 按照format的格式格式化为字符串,然后再将其拷贝至str中。
参数:
str ----string with boundary。最终格式化字符串所存储的buff
size ----boundary of the string。buff缓存区的长度,这里包括字符串结尾符‘\0’(注意:‘\0’是自动添加的,不管后面的自字符串是否包含’\0’),即可以输出到str的有效字符的大小为:size - 1
format ----standard printf format。可变参数,类似于printf中的”%d”格式
返回值:当调用失败时返回值为负数,当调用成功时返回值为格式化后的字符串的总长度(不包括\0),这个字符串有可能被截断(因为有可能buf长度不够放下整个字符串)。
二、i2c_set_clientdata、i2c_get_clientdata
以i2c-hid为例,参考:I2C客户端驱动程序_i2c_get_clientdata-CSDN博客
1.i2c_set_clientdata(设置struct deivce结构中的私有数据)
struct i2c_hid{
...
};
static int i2c_hid_probe(struct i2c_client *client, const struct i2c_device_id *dev_id)
{
...
struct i2c_hid *ihid;
struct
...
//将client->dev->driver_data 设置为ihid
i2c_set_clientdata(client, ihid);
ihid->client = client;
...
hid->driver_data = client;
}
static inline void i2c_set_clientdata(struct i2c_client *dev, void *data)
{
dev_set_drvdata(&dev->dev, data);
}
static inline void dev_set_drvdata(struct device *dev, void *data)
{
dev->driver_data = data;
}
2.i2c_get_clientdata(获取私有数据)
static int i2c_hid_remove(struct i2c_client *client)
{
//获取私有数据ihid
struct i2c_hid *ihid = i2c_get_clientdata(client);
...
}
static inline void *i2c_get_clientdata(const struct i2c_client *dev)
{
return dev_get_drvdata(&dev->dev);
}
static inline void *dev_get_drvdata(const struct device *dev)
{
return dev->driver_data;
}
三、指针
1.野指针
三种情况:
(1)指针定义时未被初始化;
(2)指针被释放时没有置空;
(3)指针操作超过变量作用域。
参考:【精选】C/C++总结笔记——指针1:野指针、空指针(NULL和nullptr)、悬空指针、智能指针_空指针野指针悬空指针-CSDN博客2.分配内存
char *p; //没有给parr初始化为NULL,系统给它分配了个野地址
int len = 0;
...
len = snprintf(buf+len, "%s", tt);
常见错误
定义了指针变量,还没有指向任何变量,就开始使用。
四、memcpy函数
bug记录-memcpy 2023.03.02-CSDN博客