添加两个相应的数组元素和 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 从函数作用域中分配的堆栈变量就结束了在那里(除非该变量被定义为静态),它从内存中删除。
它有三个修复方法:
- 将您的 return 值变量设置为静态(这将保留其值,即使函数的作用域结束);
- 使您的函数无效,而是将 return 值作为参数传递给您的函数。
- 使用全局变量来存储你的结果(虽然非常不鼓励,但在你的情况下这不会是一个坏习惯)。
在以下代码中遇到分段错误。谁能帮我解决一下?
#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 从函数作用域中分配的堆栈变量就结束了在那里(除非该变量被定义为静态),它从内存中删除。
它有三个修复方法:
- 将您的 return 值变量设置为静态(这将保留其值,即使函数的作用域结束);
- 使您的函数无效,而是将 return 值作为参数传递给您的函数。
- 使用全局变量来存储你的结果(虽然非常不鼓励,但在你的情况下这不会是一个坏习惯)。