[英]C Returning an array from a function
而且在使用C掌握數組以及如何通過函數返回數組時遇到了一些麻煩。 如果我做這樣的事情
int main()
{
int num_set[10]={0,1}; //initialize first two elements as 0,1 and rest as 0
int* p=num_set; //assign array to int pointer called p
printf("\n%i",&num_set); //outputs 2686660 on my machine
printf("\n%i",&num_set[0]); //also outputs 2686660
printf("\n%i",p); //also outputs 2686660
printf("\n%i",p[1]);* //outputs 0; the same as num_set[1]
}
它按預期工作,但是當我嘗試通過另一個函數返回數組時,如下所示
int multiply_by_2(int given_number)
{
int num_set[10];
for(int fun_counter=0; fun_counter<10; fun_counter++)
{
num_set[fun_counter] = (given_number*2) ;
}
return num_set; //return int array num_set to caller
}
int main()
{
int* p = multiply_by_2(300) //assign array returned by function to p
for(int main_counter=0; main_counter>10; main_counter++)
{
printf("\np[%i] = %i"
, i, p[i]);
}
}
我收到一條錯誤消息:“從'int'到'int *'的轉換無效”
當我在第一個代碼中將數組分配給int指針時,它們沒有錯誤,但是當我嘗試通過函數將其返回時,卻出現了此錯誤。
請幫忙。
在C語言中,您無法按值返回數組。 您將必須返回要返回的數組的指針。
傳遞指針和緩沖區大小以存儲結果。
在許多級別上這都是錯誤的,但是編譯器錯誤來自您的聲明“ multiply_by_2”。 您聲明它返回一個整數,但隨后嘗試返回一個指針。
讓我們嘗試這樣的事情:
int* multiply_by_2(int size, int given_number)
{
int *ip = (int*)malloc(size*sizeof(int)); // dynamically create int x[size]
for(int fun_counter=0; fun_counter < size; fun_counter++)
{
ip[fun_counter] = (given_number*2) ;
}
return ip; //return int array num_set to caller
}
調用者必須free()
返回的內存。
int main(int argc, char **argv) {
int *ip = multiply_by_2(3, 2);
// ip points to array {4, 4, 4}
free(ip);
return 0;
}
我們說函數調用者成為返回內存的所有者,這就是為什么您有責任稍后調用free()
的原因。
這里有很多錯誤。
函數multiply_by_2
的返回類型必須為int*
-即指向整數的指針。 實際返回的是指向數組第一個元素的指針。
您試圖返回在堆棧上初始化的變量( num_set
)。 這將盡快消失multiply_by_two
函數退出,因為它是一個自動變量 。 相反,應該使用malloc
函數分配堆內存。 這是解釋堆棧和堆內存之間區別的鏈接
您有一個>
,在main
中的for
循環中應該有一個<
。 如所寫,循環將立即退出。
次要點-數字10在整個代碼中重復幾次。 更好的做法是使用變量或#define
為數字賦予有意義的名稱
這是代碼的修改版本:
#include <stdio.h>
#include <stdlib.h> //This is required to use malloc
#define ARRAY_SIZE 10
int* multiply_by_2(int given_number)
{
int *num_set =malloc(sizeof(int)*ARRAY_SIZE);
for(int fun_counter=0; fun_counter<ARRAY_SIZE; fun_counter++)
{
num_set[fun_counter] = (given_number*2) ;
}
return num_set; //return int array num_set to caller
}
int main()
{
int* p = multiply_by_2(300); //assign array returned by function to p
for(int i=0; i<ARRAY_SIZE; i++)
{
printf("\np[%i] = %i", i, p[i]);
}
free(p);
}
int multiply_by_2(int given_number) // not returning an array, but just an int
函數的返回類型為int
因此在嘗試將其分配給int *
時會出現錯誤。 將其更改為以下內容:
int* multiply_by_2(int given_number)
這種更改是可以接受的,因為在C中,一個int
s數組可以與一個指向int
的指針互換。
您的標題錯誤。 應該
int* multiply_by_2(int given_number)
您需要返回int的指針 ,而不僅僅是int。
另一件事,在multiply_by_2
函數中,您創建了本地數組。 這意味着該函數結束后將刪除該數組。 您必須使用動態分配(malloc和free)。
程序中的三個主要問題:
- 函數的返回類型為
int
但您返回的是int *
類型。- 您正在將指針返回到自動局部變量。
main
中for
循環中的第二個表達式不會讓循環主體執行。
將函數的返回類型更改為int *
並使用動態分配。
int* multiply_by_2(int given_number)
{
int* num_set = malloc(sizeof(int)*10);
// rest of you code
}
最后將main
的for
循環中的第二個表達式更改為main_counter < 10
。 在main
使用free
釋放已分配的內存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.