如何解决realloc 函数包装上的分段错误
我用 C 编写了一个 realloc()
函数的包装,但程序给了我分段错误。
该信号是由 WRITE 内存访问引起的。提示:地址指向零页。它是在行 p[i] = i * 2; 上取消引用 NULL 指针吗?
int reallocmem(int *p,size_t newsize){
void *q;
q = realloc(p,newsize);
if(q != NULL){
p = q;
return 1;
}
return 0;
}
int main(void)
{
int *p = 0x0;
if(!reallocmem(p,10*sizeof(int))){
fprintf(stderr,"Could not reallocate memory\n");
}
int i;
int size = 10;
for(i = 0;i<size;i++){
p[i] = i * 2;
}
for(i = 0;i<size;i++){
printf("%d\n",p[i]);
}
free(p);
}
解决方法
调用函数p
后,main
中reallocmem
的值没有改变,所以程序试图解引用NULL指针,导致段错误发生。
要传递一个指针作为参数并改变它,我们需要传递一个指针的指针:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int reallocmem(int **p,size_t newsize) {
void *q;
q = realloc(*p,newsize);
if (q != NULL) {
*p = q;
return 1;
}
return 0;
}
int main(void) {
int *p = 0x0;
if (!reallocmem(&p,10 * sizeof(int))) {
fprintf(stderr,"Could not reallocate memory\n");
free(p);
return 0;
}
int i;
int size = 10;
for (i = 0; i < size; i++) {
p[i] = i * 2;
}
for (i = 0; i < size; i++) {
printf("%d\n",p[i]);
}
free(p);
}
C 程序按值传递每个参数,如果在代码中添加 printf
语句,您会发现 p
中的 reallocmem
与 {{1} 的地址不同}}在p
中,所以为了改变main
中的p
,我们需要传递main
(指向指针的指针)的地址而不是{的值{1}}。或者 p
中 p
的本地副本已更改,但不会影响调用者函数 p
。
reallocmem
,
在之前的答案之上,为了避免错误分支中的内存泄漏,必须在 realloc()
根据 manual 返回 NULL 时采取行动:
如果 realloc() 失败,则原块保持不变;它没有被释放或移动。
因此,当 realloc(p,...)
返回 NULL 时,错误分支应该释放 'p' 指向的内容(如果在调用前它不是 NULL),而不再计划使用 'p' .. .
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。