嵌入式C语言之动态内存
free释放动态内存后,p指向的动态内存已被操作系统收回,不但free是非法的,其实在这块内存上的任何操作都是非法的。//abs(x):返回x的绝对值。
一、C 语言动态开辟内存的几种方式

malloc函数的声明在stdlib.h头文件中
二、malloc和free完整例子
int main() {
int *ptr = (int *)malloc(sizeof(int));
if(NULL == ptr){
printf("内存分配失败\n");
return 0;
}
*ptr = 666;
printf("%d",*ptr);
free(ptr);// free释放ptr必须是动态内存空间
ptr = NULL;// 将ptr置为NULL,防止野指针(野指针指向的内存空间已经被释放)
}
三、calloc 分配内存空间

四、realloc函数
![]()

注意: realloc 在调整内存空间时,存在两种情况
- 原有空间之后有足够大(加上需要扩充)的连续空间,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化
- 原有空间之后没有足够大的空间
在堆空间上另找一个合适大小的连续空间来使用(并将原来的数据拷贝过去)。这样函数返回的是一个新的内存地址

五、常见的动态内存错误
- 每次动态分配内存后都要做检查,如果分配失败,给出错误信息,并结束使用内存分配的函数

2. 对同一块动态内存多次释放
free释放动态内存后,p指向的动态内存已被操作系统收回,不但free是非法的,其实在这块内存上的任何操作都是非法的。

六、修改指针的值
除了下面的方法外,还可以在函数中生成一个指向动态地址的指针变量并返回指针变量。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *getMemory(char **p) {
*p = (char *)malloc(100);
return *p;
}
int main() {
char *p = NULL;
getMemory(&p);
strcpy(p,"hello");
printf("%s\n",p);
}

七、数学函数
printf("pow(10,3):%g\n",pow(10,3));//pow(x,y);返回x的y次方
printf("sqrt(2):%g\n",sqrt(2));//sqrt(x):返回 根号x
printf("abs(-10):%d\n",abs(-10));//abs(x):返回x的绝对值
printf("ceil(10.3):%g\n",ceil(10.3));//11,向上取整。返回不小于10.3的最小整数,即大于等于10.3的最小整数
printf("floor(10.3):%g\n",floor(10.3));//10,向下取整。返回不大于10.3的最大整数,即小于等于10.3的最大整数
八、字符串函数
- strcmp函数是挨个比较两个字符串的对应字符的ASCLL码值
char s[20] = "china ";
char *s1 = "World";
//比较字符串strcmp
if(strcmp(s, s1) == 0){//表示相等
printf("s == s1\n");
}
else if(strcmp(s, s1) > 0){
printf("s > s1\n");
}
else{ //strcmp(s, s1) < 0
printf("s < s1\n");
}
2、字符串连接strcat
strcat(s,s1);//s要足够长才能容纳s1的字符串
3、字符串拷贝函数strcpy
//字符串拷贝strcpy
//char s2[20] = s;//error
char s2[20];
strcpy(s2,s);// 把s拷贝给s2
4、字符串长度
//字符串长度strlen
int len = strlen(s);
printf("%d\n", len);//11
printf("%lu\n", sizeof(s));//20
printf("%lu\n", sizeof(s1));//8,是指针的大小
char s3[] = "World";
printf("%lu\n", sizeof(s3));//6,是数组的大小,字符串个数和\0.
printf("%lu\n", strlen(s3));//5,字符个数
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐
所有评论(0)