为了防止重复踩坑,现在将踩的坑分点记录下来
1、在传递值时错误将某一指针变量的地址传递到另一指针变量,导致参数同步变化
strdup()函数
在进行值的传递时要注意传递的是指针还是值。谨记,在不需要对传入的参数进行操作,例如仅仅只是打印或者读取值时采用将参数拷贝下来的形式,拷贝函数可以使用
char *strdup(const char *str);
const char *original_str = "Hello, world!";
char *duplicate_str;
// 使用 strdup 复制字符串
duplicate_str = strdup(original_str);
strcpy(函数
strcpy()
函数用于将一个字符串复制到另一个字符串中,包括字符串结束符 \0
。它的原型如下:
char *strcpy(char *dest, const char *src);
其中,dest
是目标字符串的地址,src
是源字符串的地址。
该函数返回一个指向目标字符串的指针(即 dest
的值),这个指针指向复制后的目标字符串的起始位置。
使用 strcpy()
函数时需要注意以下几点:
- 目标字符串
dest
必须有足够的空间来存储源字符串src
,否则可能会导致缓冲区溢出。 - 源字符串
src
的内容将被完全复制到目标字符串dest
,包括结束符\0
。 - 如果目标字符串
dest
中已经包含有数据,strcpy()
函数
strdup()
和 strcpy()
的区别
-
返回类型:
strcpy()
的返回类型是char *
,它返回目标字符串的指针,即指向复制后的目标字符串的起始位置。strdup()
的返回类型也是char *
,但它返回的是一个指向新分配的内存空间的指针,该内存空间包含了复制后的字符串内容。
-
内存分配:
strcpy()
函数并不负责内存的分配,它要求调用者提供足够的目标字符串空间来存储复制后的内容。如果目标字符串空间不足,可能会导致缓冲区溢出。strdup()
函数会自动分配足够大小的内存空间来存储复制后的字符串内容,并返回指向该内存空间的指针。因此,它更安全,不容易导致缓冲区溢出,但需要手动释放内存以避免内存泄漏。
-
使用方式:
strcpy()
需要手动指定目标字符串的地址,并将源字符串复制到目标字符串中。strdup()
则只需要提供源字符串的地址,它会自动为复制后的字符串分配内存并返回指针。
-
可用性:
strcpy()
是标准 C 库函数,几乎在所有的 C 编译器中都可以使用。strdup()
不是标准 C 函数,而是一些系统提供的扩展函数。因此,它并不是所有编译器和系统都支持的。
综上所述,strcpy()
适用于在已分配好的目标字符串空间中进行字符串复制操作,而 strdup()
更适用于需要动态分配内存来存储复制后的字符串的情况。
PS:
char *Company_name = "BAIDU";
char Company_name[] = "BAIDU";
让我们来看看它们的区别:
-
char *Company_name = "GOVEE";
这种方式定义了一个指针,该指针指向一个存储在只读内存中的字符串常量 "GOVEE"。这个字符串是不可修改的,任何试图修改它的操作都会导致运行时错误。这种方式定义的字符串是静态的,它们的长度是固定的,不能修改。 -
char Company_name[] = "GOVEE";
这种方式定义了一个字符数组,并用字符串常量 "GOVEE" 来初始化它。这样的定义会在栈上分配内存空间,并将 "GOVEE" 的内容复制到数组中。这意味着你可以修改数组中的内容,因为它们被存储在可写内存中。
我们使用strcpy是是复制并且覆盖前一个,所以此时在使用指针变量的形式定义时,会报段错误
2、在进行烧录时如果突然出现烧录不进去
可以将USB口与对应杜邦线进行拔插,确认已准确插入。
这里也需要注意串口是否连接到虚拟机上,导致主机无法识别。
注意烧录的波特率,芯片的flash是否合理,端口是否准确。
3、在使用串口发送数据时,注意双方波特率是否统一
4、不要盲目相信串口打印的数据,逻辑分析仪才是真神
5、使用逻辑分析仪抓取数据时,如果抓不出来,确认一下是否共地