【问题标题】:I've got a segmentation fault but I dont find oO?我有一个分段错误,但我没有找到 oO?
【发布时间】:2017-05-26 06:54:35
【问题描述】:

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

Valgrind 告诉我失败是在从 array2 分配以及在 void 合并中的第三个 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>\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;
}

【问题讨论】:

  • 请逐步调试您的代码,然后返回更准确的问题描述。
  • 1) array[ start + j -1 ] = array2[j] --> array[ start + j] = array2[j]
  • 2) merge_sort(array, array[0], len); --> merge_sort(array, 0, len-1);
  • 3) while ( m &lt;= end ) { array2[i] = array[k]; k++; --> while ( m &lt;= end ) { array2[i] = array[m]; m++;
  • 非常感谢...在 ich 更改后 3. 有效!

标签: c arrays dynamic segmentation-fault malloc


【解决方案1】:

至少这是错误的:

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

我想你的意思是:

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

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

但是(在 64 位机器上)这实际上会使您的数组字节数减少一半,从而导致您的溢出更快发生。您有一个逻辑错误,需要通过调试器单步执行您的代码来解决。

【讨论】:

  • array = malloc(size*sizeof(array)); => array = malloc(size * sizeof *array);
猜你喜欢
  • 1970-01-01
  • 2016-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 2023-04-06
  • 2023-03-13
相关资源
最近更新 更多