C语言操作字符串时realloc函数返回空指针原因问询
realloc调用差异问题解答
首先明确核心规则:C标准中明确规定,realloc函数的第一个参数只能是以下两种情况之一:
- 空指针
NULL - 之前通过
malloc、calloc、realloc动态分配在堆区的内存指针
传入除此之外的任何指针都会触发未定义行为,大概率出现分配失败、程序崩溃等问题。
接下来对应你的两段代码分别分析:
char *s="hello"; s=realloc(s,size); // this return null
这里的s指向的是字符串字面量"hello",这类字符串常量是被编译器存储在进程的只读数据段的,不属于堆区动态分配的内存,完全不满足realloc的入参要求,因此调用失败返回NULL是非常典型的表现。
char *p; p=malloc(5); strcpy(p,"hello"); p=realloc(p,size) // this works fine
这里的p是通过malloc申请的堆区内存,符合realloc的入参规则,因此可以正常执行内存重分配操作。
补充开发规范提示:
- 不要尝试修改字符串字面量的内容,也不要将指向字符串字面量的指针传入
free、realloc这类堆内存操作函数,都会触发未定义行为。- 使用
realloc时建议先用临时指针接收返回值,确认分配成功后再赋值给原指针,避免分配失败返回NULL直接覆盖原指针,导致原内存泄漏无法释放。
内容的提问来源于stack exchange,提问作者Rafik Bouloudene
相关产品推荐
相关产品推荐

