C语言之realloc,realloc的用法,解释,验证

公众号:嵌入式不难

本文仅供参考学习,如有错误之处,欢迎留言指正。



接口

void *realloc(void *ptr, size_t size);
描述:将 ptr 指向的内存块长度重新分配为 size 字节。
返回值:重新分配 size 字节后所指向的内存块地址。

使用场景不同,结论如下

  1. realloc(NULL, 10)等效于malloc(10)
  2. realloc(ptr, 0)等效于free(ptr)
  3. size_old(原长度) > size 时,原 ptr 的内容保持不变,追加的内存空间值未知。
  4. size_old(原长度) <= size 时,原 ptr 的内容保持不变,不会重新分配内存。

实验验证

size_old(原长度) > size

实验代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argv, char *arg[])
{
    char *p = malloc(16);

    strcat(p, "0123");
    printf("before realloc\n");
    printf("p.address=%p\n", p);
    printf("p.content=%s\n", p);
    p = realloc(p, 32);
    printf("\nafter realloc\n");
    printf("p.address=%p\n", p);
    printf("p.content=%s\n", p);
    free(p);
    return 0;
}

实验结果

before realloc
p.address=0x1a70010
p.content=0123

after realloc
p.address=0x1a70440
p.content=0123

size_old(原长度) <= size

实验代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argv, char *arg[])
{
    char *p = malloc(16);

    strcat(p, "0123");
    printf("before realloc\n");
    printf("p.address=%p\n", p);
    printf("p.content=%s\n", p);
    p = realloc(p, 1);
    printf("\nafter realloc\n");
    printf("p.address=%p\n", p);
    printf("p.content=%s\n", p);
    free(p);
    return 0;
}

实验结果

before realloc
p.address=0x1258010
p.content=0123

after realloc
p.address=0x1258010
p.content=0123
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中,realloc函数用于重新分配已经分配的内存块的大小。根据C语言的规定,传递给realloc的指针必须是先前通过malloc()、calloc()或realloc()分配的。如果mem_address为NULL,则realloc()的行为和malloc()相似,它会分配一个新的大小为newsize的内存块,并返回一个指向该内存块的指针。 下面是一个关于realloc函数用法的示例代码: #include <stdio.h> #include <stdlib.h> #define N 10000 int main() { int i; int *pn = (int *)malloc(5*sizeof(int)); // 初始分配5个int大小的内存块 printf("%p\n",pn); for(i = 0; i < 5; i++) { pn[i] = i + 1; // 对分配的内存块进行赋值 } printf("%d\n",sizeof(int)); int *pnn = (int *)realloc(pn, N*sizeof(int)); // 重新分配内存块大小为N*sizeof(int) printf("%p\n",pnn); for(i = 0; i < 5; i++) { printf("%d ",pnn[i]); // 输出重新分配后的内存块中的值 } printf("\n"); free(pnn); // 释放重新分配后的内存块 return 0; } 在这个示例中,我们首先通过malloc()函数分配了一个大小为5*sizeof(int)的内存块,并对其进行了赋值。然后,我们使用realloc()函数重新分配了一个大小为N*sizeof(int)的内存块,并将原内存块中的内容复制到了新的内存块中。最后,我们输出了重新分配后的内存块中的值,并使用free()函数释放了内存块。 需要注意的是,如果realloc()函数无法成功分配新的内存块,它会返回NULL,并且原内存块保持不变。因此,在使用realloc()函数时,建议先将其返回的指针赋值给一个临时指针变量,以防分配失败造成原内存块的丢失。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [realloc() 用法详解](https://blog.csdn.net/modi000/article/details/115617903)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值