2017-08-22 134 views
-3

我一直在嘗試實現合併兩個動態序列的概念,這兩個動態序列在作爲輸入提供時已經排序。爲什麼每次都會產生「分段錯誤」?程序首先獲取兩個序列的大小併爲它們動態分配內存。將這些元素作爲輸入後,將調用名爲merge()的函數來實現該概念。它需要兩個指向該序列的指針,並返回具有合併序列的輸入序列的兩倍大小的另一個序列。這裏應該注意輸入序列已經排序。這個程序爲什麼給出'分段錯誤'?

#include <stdio.h> 
#include <stdlib.h> 

int* merge(int*, int*, int); 

int main() { 
    int *arr1, *arr2, *res; 
    int size, i; 
    printf("Enter the size of the array to be entered: "); 
    scanf("%d", &size); 
    arr1 = (int*)malloc(size * sizeof(int)); 
    arr2 = (int*)malloc(size * sizeof(int)); 
    if (arr1 == NULL || arr2 == NULL) 
     exit(1); 
    printf("Enter the elements for array 1 : \n"); 
    for (i = 0; i < size; i++) 
     scanf("%d", arr1 + i); 
    printf("Enter the elements for array 2 : \n"); 
    for (i = 0; i < size; i++) 
     scanf("%d", arr2 + i); 
    res = merge(arr1, arr2, size); 
    if (res != NULL){ 
     for (i = 0; i < 2 * size; i++) 
      printf("%d ", *(res + i)); 
    } 
    else 
     printf("The merging is not possible!"); 
    free(arr1); 
    free(arr2); 
    return 0; 
} 

int* merge(int* obj1, int* obj2, int size) { 
    int* temp = (int *)malloc(2 * size * sizeof(int)); 
    int i, j, count; 
    i = j = count = 0; 
    if (temp == NULL) 
     return NULL; 
    while (count < 2 * size){ 
     while (*(obj1 + i) <= *(obj2 + j)){ 
      *(temp + count) = *(obj1 + i); 
      count++; 
      i++; 
     } 
     while (*(obj2 + j) <= *(obj1 + i)){ 
      *(temp + count) = *(obj2 + j); 
      count++; 
      j++; 
     } 
    } 
    return temp; 
} 
+0

[請參閱爲什麼不投的malloc的返回值(c)中討論和家人..](https://stackoverflow.com/q/605845/2173917) –

+2

你有使用調試器找到導致seg故障的原因? – Haris

+0

我們可以在SO上的Linux操作系統上使用核心文件來記錄調試分段錯誤的過程嗎? 人們經常會遇到這樣的問題。 – Gaurav

回答

2
while(count < 2 * size){ 
    while(*(obj1 + i) <= *(obj2 + j)){ 
     *(temp + count) = *(obj1 + i); 
     count++; 
     i++; 
    } 

考慮obj1所有元素都小於obj2

內,而第一個元素將訪問內存越界,因爲你沒有地方檢查,如果i已達到obj1結束。你會做類似

*(obj1 + i) where i>=number of elements in obj1 

你可以使用類似下面的東西。

while(i < size && j < size) 
{ 
    if (*(obj1 + i) <= *(obj2 + j)) 
    { 
     *(temp + count) = *(obj1 + i); 
     count++; 
     i++; 
    } 
    else 
    { 
     *(temp + count) = *(obj2 + j); 
     j++; 
     count++; 
    } 
} 
while (i < size) 
{ 
    *(temp + count) = *(obj1 + i); 
    count++; 
    i++; 
} 
while (j < size) 
{ 
    *(temp + count) = *(obj2 + j); 
    count++; 
    j++; 
} 
相關問題