2

在以下代码中面临分段错误。任何人都可以帮我解决它吗?

#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

分段故障

4

3 回答 3

0

该程序具有未定义的行为,因为该函数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;
}

在主要你应该写

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

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

free( result );
于 2021-12-05T10:51:37.473 回答
-1

你的函数的返回变量是本地的,所以它不存在于函数范围之外,我的意思是一旦你从一个函数返回一个堆栈分配的变量,它的作用域就会立即结束(除非该变量被定义为静态),它被从记忆中抹去。

有三个修复它:

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

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

于 2021-12-05T10:47:38.837 回答