为什么这会导致段错误?
#include<stdio.h>
#include<stdlib.h>
struct node
{
double d;
int *array;
char c;
};
void allocator(struct node *ptr)
{
int *tmp;
tmp = (int*)realloc(ptr, 10);
if(!tmp)
{
ptr->array=tmp;
ptr->array[0] = 23;
}
}
int
main()
{
struct node *ptr = (struct node*)malloc(sizeof(struct node));
ptr->c = 'y';
allocator(ptr);
printf(" %c\n", ptr->c);
printf(" %d\n", ptr->array[0]);
return 0;
}
我得到的印象好像分配器函数中的realloc()分配内存,该内存也映射到main中malloc()分配的内存。
但这怎么可能发生?内存管理器(我猜这里的lib(stdlib))是否跟踪进程中的空闲和分配空间?
答案 0 :(得分:6)
您为struct node
分配足够的空间,然后将realloc
分配给10个字节,然后访问c
成员,由于node
的结构,可能已超过第10个字节。这会导致段错误。
此外,如果决定是否需要移动内存块,那么realloc
会返回指向新位置的指针,但main
中的指针仍然指向旧块已被收回。这也可能导致段错误。
,在此代码中:
int *tmp;
tmp = (int*)realloc(ptr, 10);
if(!tmp)
{
ptr->array=tmp;
ptr->array[0] = 23;
}
如果!tmp
,您正在访问NULL
指针,因为您正在将tmp
分配给ptr->array
,然后访问第0个元素。这也可能导致段错误。
您的代码中存在许多问题。您可能需要重写其中的大部分内容。
答案 1 :(得分:1)
这个问题是尝试访问未分配的指针,该指针发生在main:
printf(“%d \ n”,ptr-&gt; array [0]);
您的分配函数为ptr分配空间,ptr是一个结构,但不适用于该结构中的数组。可能这不是你想要做的(评论你的代码!)。