使用malloc、memory prob合并double的动态数组排序
大家好,我的MergeSort算法并不完美,它实际上是在一个类似问题中发布的同一个算法,但这甚至不是真正的问题。 基本上,用户输入一个数组大小,以及一系列值的上下限,这些值被放入一个要合并排序的双精度数组中 我可以很好地打印出数组,但在MergeSort之后,它会返回我认为是地址的负值 我知道这与内存有关,但我不知道为什么会出错,因为我相信我分配了内存并正确地清除了它。这是我的代码,特别是在今晚12:00之前,我们将非常感谢您的任何见解;) 这里是main.c、mergesort.c和mergesort.h。我也在使用makefile,但我认为没有必要共享它 主要条款c:使用malloc、memory prob合并double的动态数组排序,c,arrays,memory-management,dynamic,mergesort,C,Arrays,Memory Management,Dynamic,Mergesort,大家好,我的MergeSort算法并不完美,它实际上是在一个类似问题中发布的同一个算法,但这甚至不是真正的问题。 基本上,用户输入一个数组大小,以及一系列值的上下限,这些值被放入一个要合并排序的双精度数组中 我可以很好地打印出数组,但在MergeSort之后,它会返回我认为是地址的负值 我知道这与内存有关,但我不知道为什么会出错,因为我相信我分配了内存并正确地清除了它。这是我的代码,特别是在今晚12:00之前,我们将非常感谢您的任何见解;) 这里是main.c、mergesort.c和merge
#include <stdlib.h>
#include <stdio.h>
#include "mergesort.h"
int lower = 0;
int upper = 0;
int n = 0;
int main(int argc,char* argv[]) {
int i = 0; // loop values
int j = 0;
int r = 0; // random number
/*int n = 0; // size of array
int lower = 0; // lower bound on values in array
int upper = 0; // upper ...*/
double *t; //array of doubles
printf("Size of array?\n");
scanf("%d", &n);
printf("Lower Bound?\n");
scanf("%d", &lower);
//globLower = lower;
printf("Upper Bound?\n");
scanf("%d", &upper);
//globUpper = upper;
t = malloc(n * sizeof *t); // allocates n slots of memory
printf("Unsorted Array:\n");
for(i=0; i<n; i++) {
r = lower + arc4random() % (upper - lower);
//printf("%d\n", r);
t[i] = r; // fills array with random values in range
printf("%g\n", t[i]);
}
printf("Before Merge Sort\n");
mergeSort(t,n); // This is supposed to sort the array...
printf("After Merge Sort\n");
i = 0; //reset
// printf("%g\n", t[0]);
printf("%g\n", t[1]);
printf("%g\n", t[2]);
free(t); // Need to free the memory allocated since is stored in the heap
return 0;
}
谢谢 这里可能有两个bug:
for(j = 0; j < sizeRight; j++) {
right[i] = t[beg+j];
(j=0;j{
右[i]=t[beg+j];
这可能是:
for(j = 0; j < sizeRight; j++) {
right[j] = t[med+j];
^^^ ^^^
(j=0;j{
右[j]=t[med+j];
^^^ ^^^
Compile with-Wall-Wextra,修复警告,将函数声明放在header中等。arc4random在bsd/stdlib.hOk中,因此在修复Paul R指出的小错误后,我仍然存在同样的问题,即值是疯狂的负数,可能在mergesort之后会从数组中打印出一个实数(k=beg;k OK-你应该掌握你的调试器,并尝试单步执行代码-这将帮助你发现上述问题以及代码中的任何其他错误。嘿,谢谢,这确实有点帮助。我开始找回一些真实值,但不是全部。至于我的调试器,我正在windows上使用cygwin,我不确定它是否正确。)作为一个特征。
for(j = 0; j < sizeRight; j++) {
right[i] = t[beg+j];
for(j = 0; j < sizeRight; j++) {
right[j] = t[med+j];
^^^ ^^^