添加两个相应的数组元素和 return 结果数组

Adding two corresponding array elements and return the resultant array

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

#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;
}

输出应该像

输入数组 1 和数组 2 的大小 >3

第一个数组>5 1 7

第二个数组>2 4 2

结果 > 7 5 9

我的输出

输入数组 1 和数组 2 的大小 >3

第一个数组>5 1 7

第二个数组>2 4 2

分段错误

在multiply函数中,将m作为常量整数传递,因为array number的大小始终是常量。

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 行的函数声明。

程序有未定义的行为,因为函数 multiply returns 指向局部数组 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;
}

主要你应该写

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

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

free( result );

你的函数的 return 变量是局部的,所以它不存在于函数作用域之外,我的意思是一旦你 return 从函数作用域中分配的堆栈变量就结束了在那里(除非该变量被定义为静态),它从内存中删除。

它有三个修复方法:

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