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