首页 > 解决方案 > 在合并两个数组时,如果将数组大小作为用户的输入,那么它很好,但是如果使用 sizeof() 运算符,那么它是分段错误吗?

问题描述

//cin>>m>>n; //这使程序工作

我不明白为什么会这样。sizeof()会给和分配相同的值mn那么(cin)为什么会有错误..?

    #include<iostream>
    using namespace std;

    int * merge(int A[], int B[], int m, int n)
    {
        for(int i=m,j=0; i<(m+n);i++, j++)
        A[i]=B[j];

    }
    int main()
    {
        int A[]={1,2,3,4,5,6,7,8} , B[]={4,5,6},m,n;
        m=sizeof(A)/sizeof(int);
        n=sizeof(B)/sizeof(int);  
        merge(A,B,m,n);
        for(int i=0;i<(m+n);i++)
        cout<<A[i]<<" ";
        return 0;
    }

标签: c++arraysmergesegmentation-fault

解决方案


您的代码的问题是您尝试A在其分配的值之后写入。如果要向其中添加值,则A需要使用新值创建一个新数组,然后分配给该数组。

我们可以将您的代码更改为像这样工作

#include <iostream>

using namespace std;

// 1. Merge does not return anything, so so it should return void

void merge(int A[], int B[], int m, int n, int *R) {
    for (int i = 0; i < m; ++i) 
        R[i] = A[i];
    for (int i = m, j = 0; i < (m + n); i++, j++)
        R[i] = B[j];
}
int main() {
    int A[] = {1, 2, 3, 4, 5, 6, 7, 8};
    int B[] = {4, 5, 6};
    int m = sizeof(A) / sizeof(int);
    int n = sizeof(B) / sizeof(int);

    int result[m * n]; // Here the result will be stored

    merge(A, B, m, n, result);
    for (int i = 0; i < (m + n); i++)
        cout << result[i] << " ";
    return 0;
}


但我建议您使用标准 c++ 容器

#include <iostream>
#include <vector>


int main() {
    std::vector<int> A{1, 2, 3, 4, 5, 6, 7, 8};
    std::vector<int> B{4, 5, 6};
    
    A.insert(A.end(), B.begin(), B.end()); // Insert elements from B to A

    for (auto i: A) {
        std::cout << i << " ";
    }
    return 0;
}

推荐阅读