51单片机第6步_stdlib.h库函数

本章重点学习stdlib.h库函数。

#include <REG51.h>    //包含头文件REG51.h,使能51内部寄存器;

#include <stdlib.h>

//float atof (char *s1);

//参数s1字符串可包含正负号,小数点或E(e)来表示指数部分,如123.456或123e-2;

//若首字符是非数据字符,或为正负号且次字符不是数据,则停止转换;

//atof()会扫描参数s1字符串,跳过前面的空格字符,直到遇上数字或正负符号才开

//始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回,返回值为浮点数;

//long  atol (char *s1);

//参数s1字符串可包含正负号,如+100或-100;

//若首字符是非数据字符,或为正负号且次字符不是数据,则停止转换;

//atol()会扫描参数s1字符串,跳过前面的空格字符,直到遇上数字或正负符号才开

//始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回,返回值为4字节型数据;

//int atoi (char *s1);

//参数s1字符串可包含正负号,如+100或-100;

//若首字符是非数据字符,或为正负号且次字符不是数据,则停止转换;

//atoi()会扫描参数s1字符串,跳过前面的空格字符,直到遇上数字或正负符号才开

//始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回,返回值为双字节型数据;

//float strtod(char *s1, char **end_ptr);

//参数s1字符串可包含正负号,小数点或E(e)来表示指数部分,如123.456或123e-2;

//若s1首字符是非数据字符,或为正负号且次字符不是数据,则停止转换;

//strtod()会扫描参数s1字符串,跳过前面的空格字符,直到遇上数字或正负符号才开

//始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回,返回值为浮点数;

//将遇到不符合条件而中止的s1中的下1个字符指针保存到end_ptr中;

//long strtol(char *s, char **end_ptr, unsigned char base);

//将s字符串数组转换为base进制的有符号4字节型数据,将遇到不符合条件而中止的s中的字符指针保

//存到end_ptr中;

//若base=10或base=0,则按十进制转换;

//若字符串前置为0x,则按十六进制转换;

//若字符串前置为0,则按八进制转换;

//unsigned long strtoul (char *s, char **end_ptr, unsigned char base);

//将s字符串数组转换为base进制的无符号4字节型数据,将遇到不符合条件而中止的s中的字符指针保

//存到end_ptr中;

//若base=10或base=0,则按十进制转换;

//若字符串前置为0x,则按十六进制转换;

//若字符串前置为0,则按八进制转换;

//void xdata *calloc(unsigned int size, unsigned int len);

//在外部RAM中,分配len*size个字节空间,若允许分配,则返回首地址,且所分配RAM区域用0进行初始

//化,否则返回NULL;

//void free(void xdata *ptr);

//将ptr所指的外部RAM空间释放出来,ptr必须是经过calloc(),mcalloc(),realloc()分配的外部RAM空间;

//void xdata *malloc(unsigned int size);

//在外部RAM中,分配size个字节空间,若允许分配,则返回首地址,且所分配RAM区域不用初始化,否则

//返回NULL;

//void xdata *realloc(void xdata *ptr, unsigned int size);

//将ptr所指向的外部RAM空间改变为size个字节,小于size的部分不变,多于size的部分也不用初始化;

//当外部RAM空间没有size大时,则保持原存储空间不变;

//int init_mempool(void xdata *ptr, unsigned int memory_size);

//对外部RAM进行初始化,地址范围:ptr to ptr+memory_size;

//初始化的外部RAM区必须是函数calloc(),free(),malloc(),realloc()可以管理的区域;

//int abs(int val);计算双字节型数据val的绝对值,输入参数val为双字节型数据,返回值为双字节型数据;

//long labs(long val); 计算4字节数据val的绝对值,输入参数val为4字节型数据,返回值为4字节型数据;

//#include <intrins.h>  //包含头文件intrins.h,要放在stdio.h的头文件之前;

//使能函数: _nop_();  相当于汇编的NOP指令;

//使能函数: bit  _testbit_( bit bit_value ); 对bit_value进行测试,若bit_value=1,返回1,否则返回0;

//使能函数: unsigned char _cror_( unsigned char x, unsigned char n ); 将字节型变量x的值,向右循环移动n

//位,相当于汇编的RR A命令;

//使能函数: unsigned int  _iror_( unsigned int x,  unsigned char n ); 将双字节型变量x的值,向右循环移

//动n位,相当于汇编的RR A命令;

//使能函数: unsigned long _lror_( unsigned long x, unsigned char n ); 将4字节型变量x的值,向右循环移动

//n位,相当于汇编的RR A命令;

//使能函数: unsigned char _crol_( unsigned char x, unsigned char n ); 将字节型变量x的值,向左循环移动n

//位,相当于汇编的RL A命令;

//使能函数: unsigned int  _irol_( unsigned int x,  unsigned char n ); 将双字节型变量x的值,向左循环移

//动n位,相当于汇编的RL A命令;

//使能函数: unsigned long _lrol_( unsigned long x, unsigned char n ); 将4字节型变量x的值,向左循环移动

//n位,相当于汇编的RL A命令;

//以上的循环左移和循环右移,同C语言的左移和右移是不同的,使用时要小心;

#include <string.h>

//void *memchr(void *s,char val,int n);

//在字符串s[]中,搜索前n个字符,查找是否具有val的值,若有,则返回指向val的指针,否则返回NULL;

//char memcmp (void *s1, void *s2, int n);

//比较字符串数组s1[]和字符串数组s2[]的前n个字符是否相等,若相等,则返回0;

//若s1>s2,则返回一个正数,若s1<s2,则返回一个负数;

//char strncmp (char *s1, char *s2, int n);

//比较字符串数组s1[]和字符串数组s2[]的前n个字符是否相等,若相等,则返回0;

//若s1>s2,则返回一个正数,若s1<s2,则返回一个负数;

//char strcmp (char *s1, char *s2);

//比较字符串数组s1[]和字符串数组s2[],若s1=s2则返回0,表示这两个字符串是相同的;

//若s1>s2,则返回一个正数,若s1<s2,则返回一个负数;

//char *strcpy (char *s1, char *s2);

//将字符串数组s2[]的字符(包括结束符)拷贝到数组s1[]中,并将数组s1[]的首地址返回;

//char *strncpy (char *s1, char *s2, int n);

//将字符串s2[]的前n个字符拷贝到数组s1[]中,若s2的长度小于n,则用0补齐到长度n,拷贝到s1中,

//并将数组s1[]的首地址返回;

//void *memcpy (void *s1, void *s2, int n);

//将字符串数组s2[]的前n个字符拷贝到数组s1[]中,并将数组s1[]的首地址返回;

//注意:s1[]和s2[]是互相独立,没有重叠;

//void *memccpy (void *s1, void *s2, char val, int n);

//将字符串数组s2[]的前n个字符拷贝到数组s1[]中,若拷贝了n个字符,没有遇到val的值,则返回NULL;

//在拷贝过程中,若遇到val的值,则在拷贝完该字符后,将指向s1[]的下一个元素的指针返回;

//void *memmove (void *s1, void *s2, int n);

//将字符串数组s2[]的前n个字符拷贝到数组s1[]中,并将数组s1[]的首地址返回;

//注意:s2[]可以是s1[]的一部分,即有重叠部分;

//void *memset  (void *s, char val, int n);

//将s[]的前n个元素设置为val的值;

//char *strcat (char *s1, char *s2);

//将字符串数组s2[]拷贝到字符串数组s1[]的尾部,并将s1[]的首字符指针返回;

//注意:s1[]要可以接受s2的字符串;

//char *strncat (char *s1, char *s2, int n);

//将字符串数组s2[]的前n个字符拷贝到字符串数组s1[]的尾部,并将s1[]的首字符指针返回;

//若字串数组s2[]的元素个数小于n,则只拷贝到s2的结束符,就停止拷贝;

//int strlen (char *s1); //返回字符串s1[]中的字符个数,包括结束符'\0';

//char *strchr (const char *s, char c);

//在s[]中搜索c的值并将第1次出现c值的指针返回,若没有搜索到,则返回NULL;

//int strpos (const char *s, char c);

//在s[]中搜索c的值并将第1次出现c值的位置值返回,若没有搜索到,则返回-1;

//char *strrchr (const char *s, char c);

//在s[]中搜索c的值并将最后1个出现c值的指针返回,若没有搜索到,则返回NULL;

//int strrpos (const char *s, char c);

//在s[]中搜索c的值并将最后1个出现c值的位置值返回,若没有搜索到,则返回-1;

//char *strstr  (char *s, char *sub);

//在s[]中搜索字符串数组sub[]的字符串,并将第1次出现"sub[]的字符串"的指针返回,若没有搜索到,则返

//回NULL;

#include <stdio.h>  //包含头文件stdio.h

                 //_getkey();从串口读入一个字符;

                //putchar();向串口发送一个字节;

                //printf();向串口发送一串字节;

//函数功能:测试atof()函数;

void test_atof()

{ float data float_value;

  char s[]="+10S";

  char s1[]="-10.5D";

  char s2[]="-12e-2D";

  char s3[]=".100";

  char s4[]="e-2D";

  float_value=atof(s); //将符合符合条件的字符串转换为符点数;

   //参数s字符串可包含正负号,小数点或E(e)来表示指数部分,如123.456或123e-2;

   //若首字符是非数据字符,或为正负号且次字符不是数据,则停止转换;

   //atof()会扫描参数s字符串,跳过前面的空格字符,直到遇上数字或正负符号才开

   //始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回,返回值为浮点数;

  printf( "atof(%s)=%2.0f\n",s,float_value );   //输出:"atof(+10S)=10"

  float_value=atof(s1);

  printf( "atof(%s)=%2.1f\n",s1,float_value );  //输出:"atof(-10.5D)=-10.5";

  float_value=atof(s2);

  printf( "atof(%s)=%1.2f\n",s2,float_value );  //输出:"atof(-12e-2D)=-0.12";

  float_value=atof(s3);

  printf( "atof(%s)=%1.3f\n",s3,float_value );  //输出:"atof(.100)=0.100";

  float_value=atof(s4);

  printf( "atof(%s)=%f\n",s4,float_value );  //输出:"atof(e-2D)=NAN",不可转换;

}

//函数功能:测试strtod()函数;

void test_strtod()

{ float float_value;

  char *end_ptr;

  char s[]="+10ABCDEF";

  float_value=strtod(s,&end_ptr); //将符合符合条件的字符串转换为符点数;

//参数s字符串可包含正负号,小数点或E(e)来表示指数部分,如123.456或123e-2;

//若s首字符是非数据字符,或为正负号且次字符不是数据,则停止转换;

//strtod()会扫描参数s字符串,跳过前面的空格字符,直到遇上数字或正负符号才开

//始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回,返回值为浮点数;

//将遇到不符合条件而中止的s1中的下1个字符指针保存到end_ptr中;

  printf( "strtod(+10ABCDEF)=%f\n",float_value );   //输出:"strtod(+10ABCDEF)=10.000000"

  if(end_ptr!=NULL) printf( "stop char is %s\n",end_ptr-1 );  //输出:"stop char is ABCDEF"

}

//函数功能:测试atol()函数;

void test_atol()

{ long long_value;

  char s[]="+1000.5S";

  char s1[]="-1000.5D";

  char s2[]="-v1000.5D";

  long_value=atol(s); //将字符串数组转换为10进制的4字节型数据;

    //参数s字符串可包含正负号,如+100或-100;

    //若首字符是非数据字符,或为正负号且次字符不是数据,则停止转换;

    //atol()会扫描参数s1字符串,跳过前面的空格字符,直到遇上数字或正负符号才开

    //始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回,返回值为整型数据;

  printf( "atol(%s)=%ld\n",s,long_value );   //输出:"atol(+10.5S)=10"

  long_value=atol(s1);

  printf( "atol(%s)=%ld\n",s1,long_value );  //输出:"atol(-10.5D)=-10";

  long_value=atol(s2);

  printf( "atol(%s)=%ld\n",s2,long_value );  //输出:"atol(v10.5D)=0",不可转换;

}

//函数功能:测试strtol()函数;

void test_strtol()

{ long long_value;

  char *end_ptr;

  char s[]="-10BCDEF";

  char s1[]="A0T";

  char s2[]="0xA0T";

  char s3[]="0x10T";

  long_value=strtol(s,&end_ptr,10);  //将字符串数组转换为10进制的4字节型数据;

//将s字符串数组转换为base进制的有符号4字节型数据,将遇到不符合条件而中止的s中的下1个字符

//指针保存到end_ptr中;

//若base=10或base=0,则按十进制转换;

//若字符串前置为0x,则按十六进制转换;

//若字符串前置为0,则按八进制转换;

  printf( "strtol(%s)=%ld\n",s,long_value );   //输出:"strtol(-10BCDEF)=-10"

  if(end_ptr!=NULL) printf( "stop char is %s\n",end_ptr );  //输出:"stop char is BCDEF"

  long_value=strtol(s,&end_ptr,0); //将字符串数组转换为10进制的4字节型数据;

  printf( "strtol(%s)=%ld\n",s,long_value );   //输出:"strtol(-10BCDEF)=-10"

  if(end_ptr!=NULL) printf( "stop char is %s\n",end_ptr );  //输出:"stop char is BCDEF"

  long_value=strtol(s1,&end_ptr,16); //将字符串数组转换为16进制的4字节型数据;

  printf( "strtol(%s)=%ld\n",s1,long_value );   //输出:"strtol(A0T)=160"

  if(end_ptr!=NULL) printf( "stop char is %s\n",end_ptr );  //输出:"stop char is T"

  long_value=strtol(s2,&end_ptr,0); //将字符串数组转换为16进制的4字节型数据;

  printf( "strtol(%s)=%ld\n",s2,long_value );   //输出:"strtol(0xA0T)=160"

  if(end_ptr!=NULL) printf( "stop char is %s\n",end_ptr );  //输出:"stop char is T"

  long_value=strtol(s2,&end_ptr,10); //将字符串数组转换为10进制的4字节型数据;

  printf( "strtol(%s)=%ld\n",s2,long_value );   //输出:"strtol(0xA0T)=0"

  if(end_ptr!=NULL) printf( "stop char is %s\n",end_ptr );  //输出:"stop char is xA0T"

  long_value=strtol(s3,&end_ptr,10); //将字符串数组转换为10进制的4字节型数据;

  printf( "strtol(%s)=%ld\n",s3,long_value );   //输出:"strtol(0x10T)=0"

  if(end_ptr!=NULL) printf( "stop char is %s\n",end_ptr );  //输出:"stop char is x10T"

}

//函数功能:测试strtoul()函数;

void test_strtoul()

{ unsigned long Ulong_value;

  char *end_ptr;

  char s[]="-20T";

  char s1[]="A0T";

  char s2[]="0xA0T";

  char s3[]="0x10T";

  Ulong_value=strtoul(s,&end_ptr,10);

//将字符串数组转换为无符号10进制的4字节型数据,keil转换不正确,使用小心;

//将s字符串数组转换为base进制的无符号4字节型数据,将遇到不符合条件而中止的s中的下1个字符

//指针保存到end_ptr中;

//若base=10或base=0,则按十进制转换;

//若字符串前置为0x,则按十六进制转换;

//若字符串前置为0,则按八进制转换;

  printf( "strtoul(%s)=%ld\n",s,Ulong_value );   //输出:"strtoul(-20T)=-20",keil转换不正确;

  if(end_ptr!=NULL) printf( "stop char is %s\n",end_ptr );  //输出:"stop char is T"

  Ulong_value=strtoul(s,&end_ptr,0); //将字符串数组转换为无符号10进制的4字节型数据;

  printf( "strtoul(%s)=%lu\n",s,Ulong_value );   //输出:"strtoul(-20T)=4294967276",即-20的补码;

  if(end_ptr!=NULL) printf( "stop char is %s\n",end_ptr );  //输出:"stop char is T"

  Ulong_value=strtoul(s1,&end_ptr,16); //将字符串数组转换为无符号16进制的4字节型数据;

  printf( "strtoul(%s)=%lu\n",s1,Ulong_value );   //输出:"strtoul(A0T)=160"

  if(end_ptr!=NULL) printf( "stop char is %s\n",end_ptr );  //输出:"stop char is T"

  Ulong_value=strtoul(s2,&end_ptr,0); //将字符串数组转换为无符号16进制的4字节型数据;

  printf( "strtoul(%s)=%lu\n",s2,Ulong_value );   //输出:"strtoul(0xA0T)=160"

  if(end_ptr!=NULL) printf( "stop char is %s\n",end_ptr );  //输出:"stop char is T"

  Ulong_value=strtoul(s2,&end_ptr,10); //将字符串数组转换为无符号10进制的4字节型数据;

  printf( "strtoul(%s)=%lu\n",s2,Ulong_value );   //输出:"strtoul(0xA0T)=0"

  if(end_ptr!=NULL) printf( "stop char is %s\n",end_ptr );  //输出:"stop char is xA0T"

  Ulong_value=strtoul(s3,&end_ptr,10); //将字符串数组转换为无符号10进制的4字节型数据;

  printf( "strtoul(%s)=%lu\n",s3,Ulong_value );   //输出:"strtoul(0x10T)=0"

  if(end_ptr!=NULL) printf( "stop char is %s\n",end_ptr );  //输出:"stop char is x10T"

}

//函数功能:测试atoi()函数;

void test_atoi()

{ int int_value;

  char s[]="+10.5S";

  char s1[]="-10.5D";

  char s2[]="v10.5D";

  int_value=atoi(s);  //将字符串数组转换为2字节型数据;

    //参数s字符串可包含正负号,如+100或-100;

    //若首字符是非数据字符,或为正负号且次字符不是数据,则停止转换;

    //atoi()会扫描参数s字符串,跳过前面的空格字符,直到遇上数字或正负符号才开

    //始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回,返回值为整型数据;

  printf( "atoi(%s)=%d\n",s,int_value );   //输出:"atoi(+10.5S)=10"

  int_value=atoi(s1);

  printf( "atoi(%s)=%d\n",s1,int_value );  //输出:"atoi(-10.5D)=-10";

  int_value=atoi(s2);

  printf( "atoi(%s)=%d\n",s2,int_value );  //输出:"atoi(v10.5D)=0",不可转换;

}

//函数功能:测试calloc()和free()函数;

void test_calloc()

{ char xdata *ptr; //在外部RAM区,声明指针ptr,用来指向外部RAM的地址;

  ptr=calloc( 1,10 ); //分配10个单字节空间;

  //在外部RAM中,分配len*size个字节空间,若允许分配,则返回首地址,且所分配RAM区域用0进行初

//始化,否则返回NULL;

  //使用软件模拟仿真外部RAM,必须另外添加零件库才可以;

  if(ptr==NULL)  printf( "There is no space\n");

  else{ strcpy( ptr,"123456789" );  //将"123456789"拷贝到ptr的数组里;

        printf("Array address is %p\n",&ptr ); //输出:"Array address is x:0000"

        printf( "String is %s\n",&ptr );       //输出:"String is 123456789"

      }

  free(ptr); //将ptr所指向的外部RAM空间释放出来;

}

//函数功能:测试malloc()和free()函数;

void test_malloc()

{ char xdata *ptr;     //在外部RAM区,声明指针ptr,用来指向外部RAM的地址;

  ptr=malloc( 10 );   //分配10个字节空间;

  //在外部RAM中,分配10个字节空间,若允许分配,则返回首地址,且所分配RAM不用初始化,否则返回

//NULL;

  //使用软件模拟仿真外部RAM,必须另外添加零件库才可以;

  if(ptr==NULL)  printf( "There is no space\n");

  else{ strcpy( ptr,"12345ABCD" );  //将"12345ABCD"拷贝到ptr的数组里;

        printf("Array address is %p\n",&ptr ); //输出:"Array address is x:0000"

        printf( "String is %s\n",&ptr );       //输出:"String is 12345ABCD"

      }

  free(ptr);  //将ptr所指向的外部RAM空间释放出来;

}

//函数功能:测试realloc()和free()函数;

void test_realloc()

{ char xdata *ptr;   //在外部RAM区,声明指针ptr,用来指向外部RAM的地址;

  char xdata *p;

  p=malloc(10);  //分配10个字节空间;

  //在外部RAM中,分配10个字节空间,若允许分配,则返回首地址,且所分配RAM不用初始化,否则返回

//NULL;

  //使用软件模拟仿真外部RAM,必须另外添加零件库才可以;

  if(p!=NULL)

    { strcpy( p,"123456789" );  //将"123456789"拷贝到ptr的数组里;

      ptr=realloc(p,5);

//将p所指向的外部RAM空间改变为5个字节,小于5的部分不变,多于5的部分也不用初始化;

//当外部RAM空间没有5个字节大时,则保持原存储空间不变;

  if(ptr==NULL) printf( "There is no space for *ptr\n");   //输出:"There is no space for *ptr"

      else printf( "String is %s\n",&ptr );

}

  else printf( "There is no space for *P\n");

}

//函数功能:测试init_mempool()函数;

void test_init_mempool()

{ char xdata *ptr;   //在外部RAM区,声明指针ptr,用来指向外部RAM的地址;

  ptr=calloc( 1,10 ); //分配个字节空间;

  //在外部RAM中,分配len*size个字节空间,若允许分配,则返回首地址,且所分配RAM区域用0进行初

//始化,否则返回NULL;

  //使用软件模拟仿真外部RAM,必须另外添加零件库才可以;

  if(ptr==NULL)  printf( "There is no space\n");

  else{ strcpy( ptr,"123456789" );             //将"123456789"拷贝到ptr的数组里;

        printf("Array address is %p\n",&ptr );  //输出:"Array address is x:0000"

        printf( "String is %s\n",&ptr );        //输出:"String is 123456789"

init_mempool(ptr,10);

   //对外部RAM进行初始化,地址范围:ptr to ptr+10;

        //初始化的外部RAM区必须是函数calloc(),free(),malloc(),realloc()可以管理的区域;

      }

  free(ptr);   //将ptr所指向的外部RAM空间释放出来;

}

//函数功能:测试abs()函数;

void test_abs()

{ int int_value;

  int_value=abs(-100);

//计算双字节型数据val的绝对值,输入参数val为双字节型数据,返回值为双字节型数据;

  printf( "abs(-100)=%d\n",int_value ); //输出:"abs(-100)=100"

  int_value=abs(150);

//计算双字节型数据val的绝对值,输入参数val为双字节型数据,返回值为双字节型数据;

  printf( "abs(150)=%d\n",int_value ); //输出:"abs(150)=150"

}

//函数功能:测试labs()函数;

void test_labs()

{ long long_value;

  long_value=labs(-1000);

//计算4字节型数据val的绝对值,输入参数val为4字节型数据,返回值为4字节型数据;

  printf( "labs(-1000)=%ld\n",long_value ); //输出:"labs(-1000)=1000"

}

//函数功能:初始化串口,设置波特率为1200bps@16MHz,使能接收,使用8位UART;

void Serial_Port_Initialization()

{ SCON  = 0x50; //串行控制寄存器: SM0,SM1,SM2,REN,TB8,RB8,TI,RI

                 //SM1:SM0=01,选择方式1,SM2=0,表示非多机通讯,8-bit UART;

//REN=1,使能接收;

  TMOD |= 0x20; //定时器方式控制寄存器:GATE1,C/T1,M11,M10,GATE0,C/T0,M01,M00

                //GATE=0,TR置1便可以启动Timer;GATE=1,TR置1,且INT脚输入高电平,才

//可以启动Timer;

   //M11:M10=10,选择方式2,8位自动重装载;

  TH1   = 221;  //TH1:  reload value for 1200 baud @ 16MHz

  TR1   = 1;    //启动Timer1;

  TI    = 1;    //发送UART的第一个字节,为下次发送做准备;

}

void main(void)

{

  Serial_Port_Initialization(); //初始化串口,设置波特率为1200bps@16MHz,使能接收,使用8位UART;

  for(;;)

     { test_atof(); //测试atof()函数;

     test_atol();   //测试atol()函数;

     test_atoi();   //测试atoi()函数;

     test_abs();    //测试abs()函数;

     test_labs();  //测试Labs()函数;

     test_strtod();   //测试strtod()函数;

     test_strtol();   //测试strtol()函数;

     test_strtoul();  //测试strtoul()函数;

     test_calloc();  //测试calloc()和free()函数;

     test_malloc();        //测试malloc()和free()函数;

     test_realloc();        //测试realloc()和free()函数;

     test_init_mempool();  //测试init_mempool()函数;

   }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/759337.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣每日一题 6/30 记忆化搜索/动态规划

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 494.目标和【中等】 题目&#xff1a; 给你一个非负整数数组 nums 和一个…

VMware中的三种虚拟网络模式

虚拟机网络模式 1 主机网络环境2 VMware中的三种虚拟网络模式2.1 桥接模式NAT模式仅主机模式网络模式选择1 VMware虚拟网络配置2 虚拟机选择网络模式3 Windows主机网络配置 配置静态IP 虚拟机联网方式为桥接模式&#xff0c;这种模式下&#xff0c;虚拟机通过主机的物理网卡&am…

mysql8.0-学习

文章目录 mysql8.0基础知识-学习安装mysql_8.0登录mysql8.0的体系结构与管理体系结构图连接mysqlmysql8.0的 “新姿势” mysql的日常管理用户安全权限练习查看用户的权限回收:revoke角色 mysql的多种连接方式socket显示系统中当前运行的所有线程 tcp/ip客户端工具基于SSL的安全…

2024最新boss直聘岗位数据爬虫,并进行可视化分析

前言 近年来,随着互联网的发展和就业市场的变化,数据科学与爬虫技术在招聘信息分析中的应用变得越来越重要。通过对招聘信息的爬取和可视化分析,我们可以更好地了解当前的就业市场动态、职位需求和薪资水平,从而为求职者和招聘企业提供有价值的数据支持。本文将介绍如何使…

Linux系统编程--进程间通信

目录 1. 介绍 1.1 进程间通信的目的 1.2 进程间通信的分类 2. 管道 2.1 什么是管道 2.2 匿名管道 2.2.1 接口 2.2.2 步骤--以父子进程通信为例 2.2.3 站在文件描述符角度-深度理解 2.2.4 管道代码 2.2.5 读写特征 2.2.6 管道特征 2.3 命名管道 2.3.1 接口 2.3.2…

【驱动篇】龙芯LS2K0300之i2c设备驱动

实验背景 由于官方内核i2c的BSP有问题&#xff08;怀疑是设备树这块&#xff09;&#xff0c;本次实验将不通过设备树来驱动aht20&#xff08;i2c&#xff09;模块&#xff0c;大致的操作过程如下&#xff1a; 模块连接&#xff0c;查看aht20设备地址编写device驱动&#xff…

K8S之网络深度剖析(一)(持续更新ing)

K8S之网络深度剖析 一 、关于K8S的网络模型 在K8s的世界上,IP是以Pod为单位进行分配的。一个Pod内部的所有容器共享一个网络堆栈(相当于一个网络命名空间,它们的IP地址、网络设备、配置等都是共享的)。按照这个网络原则抽象出来的为每个Pod都设置一个IP地址的模型也被称作为I…

忍法:声音克隆之术

前言&#xff1a; 最近因为一直在给肚子里面的宝宝做故事胎教&#xff0c;每天&#xff08;其实是看自己心情抽空讲下故事&#xff09;都要给宝宝讲故事&#xff0c;心想反正宝宝也看不见我&#xff0c;只听我的声音&#xff0c;干脆偷个懒&#xff0c;克隆自己的声音&#xf…

信息学奥赛初赛天天练-40-CSP-J2021基础题-组合数学-缩倍法、平均分组、2进制转10进制、面向过程/面向对象语言应用

PDF文档公众号回复关键字:20240630 2021 CSP-J 选择题 单项选择题&#xff08;共15题&#xff0c;每题2分&#xff0c;共计30分&#xff1a;每题有且仅有一个正确选项&#xff09; 1.以下不属于面向对象程序设计语言是( ) A. C B. Python C. Java D. C 2.以下奖项与计…

R包的4种安装方式及常见问题解决方法

R包的4种安装方式及常见问题解决方法 R包的四种安装方式1. install.packages()2. 从Bioconductor安装3. 从本地源码安装4. 从github安装 常见问题的解决1. 版本问题2. 网络/镜像问题3.缺少Rtools R包的四种安装方式 1. install.packages() 对于R自带的包的安装一般都可以通过…

HarmonyOS--路由管理--组件导航 (Navigation)

文档中心 什么是组件导航 (Navigation) &#xff1f; 1、Navigation是路由容器组件&#xff0c;一般作为首页的根容器&#xff0c;包括单栏(Stack)、分栏(Split)和自适应(Auto)三种显示模式 2、Navigation组件适用于模块内和跨模块的路由切换&#xff0c;一次开发&#xff0…

实现点击按钮导出页面pdf

在Vue 3 Vite项目中&#xff0c;你可以使用html2canvas和jspdf库来实现将页面某部分导出为PDF文档的功能。以下是一个简单的实现方式&#xff1a; 1.安装html2canvas和jspdf&#xff1a; pnpm install html2canvas jspdf 2.在Vue组件中使用这些库来实现导出功能&#xff1a;…

网线直连电脑可以上网,网线连tplink路由器上不了网

家里wifi网络连不上好几天了&#xff0c;用网线直连电脑可以上网&#xff0c;但网线连tplink路由器wan口上不了网&#xff0c;无Internet连接&#xff0c;网线连lan口可以电脑上网&#xff0c;手机上不了。 后来发现网线的主路由用的192.168.0.1&#xff0c;我的路由器wan口自…

在node环境使用MySQL

什么是Sequelize? Sequelize是一个基于Promise的NodeJS ORM模块 什么是ORM? ORM(Object-Relational-Mapping)是对象关系映射 对象关系映射可以把JS中的类和对象&#xff0c;和数据库中的表和数据进行关系映射。映射之后我们就可以直接通过类和对象来操作数据表和数据了, 就…

【大数据导论】大数据序言

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 目录 数据概念及类型及可用及组织形式数据概念数据…

golang项目基于gorm框架从postgre数据库迁移到达梦数据库的实践

一、安装达梦数据库 1、登录达梦数据库官网&#xff0c;下载对应系统版本的安装包。 2、下载地址为&#xff1a;https://www.dameng.com/list_103.html 3、达梦数据库对大小写敏感&#xff0c;在安装初始化数据库实例时建议忽略大小写&#xff1b;具体安装教程可参考以下博客: …

python办公自动化之pandas

用到的库&#xff1a;pandas 实现效果&#xff1a;创建一张空白的表同时往里面插入准备好的数据 代码&#xff1a; import pandas # 准备好要写入的数据&#xff0c;字典格式 data{日期:[7.2,7.3],产品型号:[ca,ce],成交量:[500,600]} dfpandas.DataFrame(data) # 把数据写入…

Java代码基础算法练习-计算被 3 或 5 整除数之和-2024.06.29

任务描述&#xff1a; 计算 1 到 n 之间能够被 3 或者 5 整除的数之和。 解决思路&#xff1a; 输入的数字为 for 循环总次数&#xff0c;每次循环就以当前的 i 进行 3、5 的取余操作&#xff0c;都成立计入总数sum中&#xff0c;循环结束&#xff0c;输出 sum 的值 代码示例&…

QT加载安装外围依赖库的翻译文件后翻译失败的现象分析:依赖库以饿汉式的形式暴露单例接口导致该现象的产生

1、前提说明 QtClassLibaryDll是动态库,QtWidgetsApplication4是应用程序。 首先明确:动态库以饿汉式的形式进行单例接口暴露; 然后,应用程序加载动态库的翻译文件并进行全局安装; // ...QTranslator* trans = new QTranslator();//qDebug() << trans->load(&quo…

大模型系列:提示词管理

既然大模型应用的编程范式是面向提示词的编程&#xff0c;需要建立一个全面且结构化的提示词库&#xff0c; 对提示词进行持续优化也是必不可少的&#xff0c;那么如何在大模型应用中更好的管理提示词呢&#xff1f; 1. 提示词回顾 提示词在本质上是向大型语言模型&#xff08…