一、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 在调整内存空间时,存在两种情况

  1. 原有空间之后有足够大(加上需要扩充)的连续空间,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化
  2. 原有空间之后没有足够大的空间

在堆空间上另找一个合适大小的连续空间来使用(并将原来的数据拷贝过去)。这样函数返回的是一个新的内存地址

五、常见的动态内存错误

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

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的最大整数

八、字符串函数

  1. 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,字符个数

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐