使用char*直接赋值后调用realloc触发invalid pointer错误的原因
realloc(): invalid pointer 错误原因解析
先看你的代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *cp; cp = (char *)malloc(10 * sizeof(char)); cp="kerem"; //strcpy(cp, "kerem"); printf("%s",cp); cp=(char *)realloc(cp,30 * sizeof(char)); //strcpy(cp, "kerem demir Aziz Kerem Demir"); cp= "kerem demir Aziz Kerem Demir"; printf("%s",cp); //free(cp); return 0; }
核心问题:指针指向的内存区域不合法
- 执行
cp = (char *)malloc(10 * sizeof(char));时,cp指向堆上分配的内存块,这是realloc/free的合法操作对象。 - 但
cp="kerem";直接改变了cp的指向——它不再指向之前malloc分配的堆内存,转而指向字符串常量"kerem"所在的只读数据段内存,这部分内存并非通过malloc/calloc/realloc分配。 realloc的规则明确:第一个参数必须是从malloc/calloc/realloc获取的堆内存指针,或者是NULL。你传入字符串常量的地址,不符合要求,因此触发realloc(): invalid pointer错误。
为什么用strcpy就没问题?
strcpy(cp, "kerem");并没有改变cp的指向——它仍然指向malloc分配的堆内存,只是把"kerem"的内容复制到了这块堆内存里。此时cp还是合法的堆内存指针,后续调用realloc自然不会报错。
额外提醒
你最后写的cp= "kerem demir Aziz Kerem Demir";同样是让cp指向字符串常量,如果打开注释执行free(cp);,也会触发类似的free(): invalid pointer错误,因为free只能释放堆内存,不能操作字符串常量的内存。
内容的提问来源于stack exchange,提问作者kerem0101
相关产品推荐
相关产品推荐

