为什么这个程序会给出“分段错误”?

时间:2017-08-22 10:51:52

标签: c

我一直在尝试实现合并两个动态序列的概念,这两个动态序列在作为输入提供时已经排序。为什么会产生分段错误'每次?程序首先获取两个序列的大小,并为它们动态分配内存。在将元素作为输入之后,调用名为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;
}

1 个答案:

答案 0 :(得分:2)

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

考虑obj1中的所有元素都小于obj2

的第一个元素

内部while会访问内存越界,因为你无法检查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++;
}