【问题标题】:Adding two corresponding array elements and return the resultant array添加两个对应的数组元素并返回结果数组
【发布时间】:2022-01-10 22:51:55
【问题描述】:

在以下代码中遇到分段错误。谁能帮我修一下?

#include<stdio.h>

int* multiply(int *arr1, int *arr2, int m);

int main(void){
    int m = 0;
    
    
    printf("Enter size of array1 and array2 >");
    scanf("%d",&m);

    int arr1[m],  arr2[m];
        printf("First array>");

    for(int i = 0; i < m; ++i){
        scanf("%d", &arr1[i]);
    }
    printf("Second array> ");
    for(int j = 0; j < m; j++)
       scanf("%d", &arr2[j]);

    
    
    int* result = multiply(arr1, arr2, m);

    for(int i = 0; i < m; ++i){
        printf("%d ", result[i]);
    }
    


}

int* multiply(int *arr1, int *arr2, int m){
    int res[m];
    printf("ok");
    for(int i = 0; i < m; ++i){
        res[i] = arr1[i] + arr2[i];
    }
    printf("ok");
    return res;
}

输出应该是这样的

输入array1和array2的大小>3

第一个数组>5 1 7

第二个数组> 2 4 2

结果 > 7 5 9

我的输出

输入array1和array2的大小>3

第一个数组>5 1 7

第二个数组> 2 4 2

分段错误

【问题讨论】:

    标签: c scope function-definition variable-length-array storage-duration


    【解决方案1】:

    程序具有未定义的行为,因为函数 multiply 返回一个指向本地数组 res 的指针,该指针在退出函数后将不再存在。所以退出函数后返回的指针是无效的。

    int* multiply(int *arr1, int *arr2, int m){
        int res[m];
        printf("ok");
        for(int i = 0; i < m; ++i){
            res[i] = arr1[i] + arr2[i];
        }
        printf("ok");
        return res;
    }
    

    您需要为数组动态分配内存。 此外,表示数组的参数应该有限定符const,因为传递的数组不会在函数内更改。

    函数可以通过以下方式声明和定义。

    int * multiply( const int *arr1, const int *arr2, size_t n )
    {
        int *res = NULL;
    
        if ( n != 0 && ( res = malloc( n * sizeof( int ) ) ) != NULL )
        {
            for( size_t i = 0; i < n; ++i )
            {
                res[i] = arr1[i] + arr2[i];
            }
        }
    
        return res;
    }
    

    在 main 你应该写

    int* result = multiply(arr1, arr2, m);
    
    if ( result != NULL )
    {
        for(int i = 0; i < m; ++i){
            printf("%d ", result[i]);
        }
    }
    
    free( result );
    

    【讨论】:

      【解决方案2】:

      您的函数的返回变量是本地的,因此它不存在于函数范围之外,我的意思是一旦您从一个函数返回一个堆栈分配的变量,它的范围就会立即结束(除非该变量被定义为静态),它会从内存中删除。

      有三个修复方法:

      1. 将返回值变量设为静态(即使函数的作用域结束,这也会保留其值);
      2. 使您的函数无效,而是将返回值作为参数传递给您的函数。
      3. 使用全局变量来存储您的结果(虽然非常不鼓励,但在您的情况下这不是一个坏习惯)。

      【讨论】:

        【解决方案3】:

        在multiply函数中,将m作为一个常数传入,因为数组编号的大小始终是一个常数。

        int* multiply(int *arr1, int *arr2, const int m){
            int res[m];
            printf("ok");
            for(int i = 0; i < m; ++i){
                res[i] = arr1[i] + arr2[i];
            }
            printf("ok");
            return res;
        }
        

        不要忘记在第 3 行更改函数的声明。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-09-16
          • 1970-01-01
          • 2014-03-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-22
          相关资源
          最近更新 更多