访问结构对象时出现分段错误

时间:2014-06-02 09:57:08

标签: c

我正在尝试用C语言实现heapsort程序。 当我尝试打印排序的数组时,整个程序一直工作到最后一部分。 排序结束时,我无法访问结构的任何元素。 请帮我解决错误。

程序如下     // programe实现堆排序

#include<stdio.h>
#include<stdlib.h>
struct MaxHeap
{
int size;
int* array;
};

void print_array(int arr[],int size)
{
int i;
printf("Entered print_array function\n");
for(i=0;i<size;i++)
   printf("%d ",arr[i]);
printf("\n");
}

void swap(int *p, int *q)
{
int temp=*p;
*p=*q;
*q=temp;
}

void heapify(struct MaxHeap* maxheap,int x)
{
if(maxheap->array[x] < maxheap->array[(2*x + 1)] && (2*x + 1) < maxheap->size)
   swap(&(maxheap->array[x]),&(maxheap->array[(2*x + 1)]));
if(maxheap->array[x] < maxheap->array[(2*x + 2)] && (2*x + 2) < maxheap->size)
   swap(&(maxheap->array[x]),&(maxheap->array[(2*x + 2)]));
}

struct MaxHeap* create_maxheap(int arr[],int size)
{
struct MaxHeap* maxheap = (struct MaxHeap*)malloc(sizeof(struct MaxHeap));
maxheap->size = size;
maxheap->array =arr; 
int i;
for(i=(maxheap->size-1)/2;i>=0;i--)
   heapify(maxheap,i);

return maxheap;
}

void heap_sort(struct MaxHeap* maxheap)
{
int i;
while(maxheap->size>0)
{
   swap(&(maxheap->array[0]),&(maxheap->array[maxheap->size]));
   maxheap->size--;
//   printf("maxheap->size is %d\n",maxheap->size);
   heapify(maxheap,0);
}
}

void main()
{
int tmp[] = {3,1,3};
int size = 3;
struct MaxHeap* maxheap=create_maxheap(tmp,size);

printf("The MaxHeap is created with size %d\n",maxheap->size);

heap_sort(maxheap);
printf("The array after sorting is \n");
print_array(maxheap->array,size);
}

输出如下

The MaxHeap is created with size 3
maxheap->size is 2
maxheap->size is 1
maxheap->size is 0
The array after sorting is 
Segmentation fault

2 个答案:

答案 0 :(得分:0)

优秀的评论告诉您如何修复您的计划

以下是可能出现的问题

main()中有几个堆栈变量。这些将在堆栈上或多或少地连续布局。其中一个是阵列, 其中一条评论表明代码正试图访问这些元素 出界。

数组只有3个整数,代码尝试写入第4个元素 (即3的索引),它可能最终改变大小变量。注意 我使用'may'而不是'will',因为取决于编译器选项等,  它可以是一些其他变量,甚至是未使用的填充空间。这个无效 下次使用该变量时,将注意到变量的更新。

数组越界写入的问题是问题及其影响 可能是完全不相关的代码,导致调试它的人感到悲伤,并且 为几乎三分之一的c / c ++程序员提供就业机会。

我建议打印'size'的值来测试我的假设!

现在如果尺寸确实腐败,而且非常高,那么下一个问题是 为什么屏幕上不打印至少3个值。答案就在那里 printf写入的FILE结构(stdout是FIFO *)确实如此 缓冲,仅在内部缓冲区已满时写入OS。要调试 这些问题,在每个printf()之后放了一个fflush(stdout)。

答案 1 :(得分:0)

全心全意,

我发现错误在交换功能中     交换(及(maxheap-&GT;阵列[0]),及(maxheap-&GT;阵列[maxheap-&GT;大小]));

应该是     swap(&amp;(maxheap-&gt; array [0]),&amp;(maxheap-&gt; array [maxheap-&gt; size - 1]));

这解决了这个问题。