1:realloc
void *realloc(void *ptr, size_t size)
- ptr – 指针指向一个要重新分配内存的内存块,该内存块之前是通过调用 malloc、calloc 或 realloc
进行分配内存的。如果为空指针,则会分配一个新的内存块,且函数返回一个指向它的指针。 - size --内存块的新的大小,以字节为单位。如果大小为 0,且 ptr 指向一个已存在的内存块,则 ptr
所指向的内存块会被释放,并返回一个空指针 - 该函数返回一个指针 ,指向重新分配大小的内存。如果请求失败,则返回 NULL
这个函数,会重新为指针ptr分配空间,可以扩大也可以缩小。如果扩大的话,原先ptr后面有空间就直接扩大后面的空间,ptr起始地址不变。如果没有的话,就会找一个足够大的地址,把ptr中的内容复制过去,更新ptr的指针,原先ptr的空间会被释放掉。
所以存在一定的风险,当你新地址空间申请失败,而原来的空间也被释放掉了,那么你将一无所有。
2:sscanf
int sscanf(const char *str, const char *format, ...)
- str – 这是 C 字符串,是函数检索数据的源。
- format – 这是 C 字符串,包含了以下各项中的一个或多个:空格字符、非空格字符 和 format 说明符。
这个函数,主要作用可以把一个字符串按照给定的格式拆分到各种数据中。比如你向让字符串"1234"变成十进制或16禁止的1,2,3,4,保存在数据int a[]中,就可以使用这个函数。
这个函数的作用正好和sprintf相反
3:0x%02hhx
这个一个格式打印字符,可以只取数据中的2位进行输出。相比与%02x当数据超过2位时会按照真实的位数输出,%02hhx可以严格控制在2位输出,如果多出,会被舍弃。
4:示例
/*************************************************************************
> File Name: relloc.c
> Author: kayshi
> Mail: kayshi2019@qq.com
> Created Time: Tue 10 Nov 2020 03:59:00 PM CST
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *str;
int day, year;
int i;
char weekday[20], month[20], dtm[100], test[4], da[4];
int data = 0x12345678;
str = (char *)malloc(5);
strcpy(str, "hello");
printf("String = %s, Address = %p\n", str, str);
str = (char *)realloc(str, 10);
strcat(str, "world");
printf("String = %s, Address = %p\n", str, str);
free(str);
strcpy(dtm, "Saturday March 25 1898 abcd 1234");
sscanf(dtm, "%s %s %d %d %c%c%c%c %01hhd%01hhd%01hhd%01hhd", weekday, month, &day, &year,\
&test[0], &test[1], &test[2], &test[3], &da[0], &da[1], &da[2], &da[3]);
printf("%s %d, %d = %s\n", month, day, year, weekday );
for(i = 0; i < 4; i++)
{
printf("%c ", test[i]);
}
for(i = 0; i < 4; i++)
{
printf("%d ", da[i]);
}
printf("\n");
printf("0x%02hhx, 0x%02hx, 0x%02x\n", data, data, data);
return(0);
}
结果
kayshi@ubuntu:~/code/Test$ ./a.out
String = hello, Address = 0x55b8d0619260
String = helloworld, Address = 0x55b8d0619260
March 25, 1898 = Saturday
a b c d 1 2 3 4
0x78, 0x5678, 0x12345678