在以下代碼中面臨分段錯誤。任何人都可以幫我修復它嗎?
#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
分段故障
uj5u.com熱心網友回復:
該程式具有未定義的行為,因為該函式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 );
uj5u.com熱心網友回復:
你的函式的回傳變數是區域的,所以它不存在于函式作用域之外,我的意思是一旦你從一個函式回傳一個堆疊分配的變數,它的作用域就會立即結束(除非該變數被定義為靜態),它被從記憶中抹去。
它有三個修復:
- 使您的回傳值變數保持靜態(即使函式的作用域結束,這也將保留其值);
- 使您的函式無效,而是將回傳值作為引數傳遞給您的函式。
- 使用全域變數來存盤您的結果(雖然非常不鼓勵,但在您的情況下這不會是一個壞習慣)。
uj5u.com熱心網友回復:
在乘法函式中,將m作為常量整數傳遞,因為陣列 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 行的函式宣告。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/373373.html
上一篇:交換鏈表中的陣列
