我有分段错误,但我没有找到oO? [英] I've got a segmentation fault but I dont find oO?

查看:156
本文介绍了我有分段错误,但我没有找到oO?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

它应该按合并排序。合并和排序合并有两个功能。一些不知道的函数(从文件和打印数组读取数组)在输入文件中完全有效。



Valgrind显示失败是从array2分配的,它在void merge中的第3个while循环中读写。

  void merge(int * array,int start,int middle ,int end){

int size = end - start + 1;
int * array2 = malloc(size * sizeof(array2));

int k = start;
int m = middle + 1;
int i = 0;
int j = 0;

while(k <= middle&& m< = end){
if(array [k] <= array [m]){
array2 [i] = array [k];
k ++;
}
else {
array2 [i] = array [m];
m ++;
}
i ++;
}
while(k <= middle){
array2 [i] = array [k];
k ++;
i ++;
}
while(m <= end){
array2 [i] = array [k];
k ++;
i ++;
}
while(j< i){
array [start + j -1] = array2 [j];
j ++;
}
free(array2);
}

void merge_sort(int * array,int first,int last){

int middle;

if(first< last){
middle =((first + last)/ 2);
merge_sort(array,first,middle);
merge_sort(array,middle + 1,last);
merge(array,first,middle,last);
}
}

int main(int argc,char * argv [])
{
if(argc!= 3){
printf(usage:%s< maximale anzahl>< dateipfad> \\\
,argv [0]);
exit(2);
}

char * filename = argv [2];

int * array;
int size = atoi(argv [1]);
array = malloc(size * sizeof(array));

int len = read_array_from_file(array,atoi(argv [1]),filename);

printf(Eingabe:\\\
);
print_array(array,len);

merge_sort(array,array [0],len);

printf(Sortiert:\\\
);
print_array(array,len);

free(array);
return 0;
}


解决方案

至少这是错误的:

  int * array2 = malloc(size * sizeof(array2)); 

我想你的意思是:

  int * array2 = malloc(size * sizeof(* array2)); 

您要分配 size 的每个条目,而不是数组指针的大小。



但是(在64位机器上)这实际上会使您的数组的字节数减半,导致您的超支发生得更早。您有一个逻辑错误,您需要通过使用调试器遍历代码来弄清楚。


It should sort with merge. There are two functions the merge and the sort merge. Some not known functions (read array from file and print array) are totally functional in an input file.

Valgrind show me that the failure is at the allocation from array2 and when it read and write at the 3rd while-loop in void merge.

void merge(int* array, int start, int middle, int end) {

    int size = end - start + 1;
    int *array2 = malloc(size*sizeof(array2));

    int k = start;
    int m = middle + 1;
    int i = 0;
    int j = 0;

    while ( k <= middle && m <= end ) {
        if ( array[k] <= array[m] ) {
            array2[i] = array[k];
            k++;        
        }
        else {
            array2[i] = array[m];
            m++;
        }
        i++;
    }
    while ( k <= middle ) {
        array2[i] = array[k];
        k++;
        i++;
    }
    while ( m <= end ) {
        array2[i] = array[k];
        k++;
        i++;
    }
    while ( j < i ) {
        array[ start + j -1 ] = array2[j];
        j++;
    }
    free(array2);
}

void merge_sort(int* array, int first, int last) {

    int middle;

    if ( first < last ) {
        middle = ((first+last) / 2);
        merge_sort (array, first, middle);
        merge_sort (array, middle + 1, last);
        merge (array, first, middle, last); 
    }
}

int main (int argc, char *argv[])
{
    if (argc!=3) {
            printf ("usage: %s <maximale anzahl>  <dateipfad>\n", argv[0]);
            exit(2);
        }

    char *filename = argv[2];

    int *array; 
    int size = atoi(argv[1]);    
    array = malloc(size*sizeof(array));

    int len = read_array_from_file(array, atoi(argv[1]), filename);

    printf("Eingabe:\n");
    print_array(array, len);

    merge_sort(array, array[0], len);

    printf("Sortiert:\n");
    print_array(array, len);

    free(array);
    return 0;
}

解决方案

At least this is wrong:

int *array2 = malloc(size*sizeof(array2));

I think you mean:

int *array2 = malloc(size * sizeof(*array2));

You want to allocate size times the size of each entry, not the size of the array pointer.

But (on a 64-bit machine) this will actually make your array half the number of bytes, causing your overrun to happen sooner. You have a logic error that you need to figure out by stepping through your code with a debugger.

这篇关于我有分段错误,但我没有找到oO?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆