[英]Function with return type array in C
我在C中有以下功能:
int[] function(int a){
int * var = (int*)malloc(sizeof(int)*tags);
....
}
*var
是指向數組var
的指針嗎?
如果是,我如何在函數中返回數組( var
)?
你不能真正從函數返回一個數組,而是一個指針:
int * function(int a){
int * var = malloc(sizeof(int)*tags);
//....
return var;
}
下面的代碼可以澄清數組和指針的工作原理。 該函數將為“tags”int變量分配內存,然后它將使用數字初始化每個元素並返回指向數組的內存段。 從main函數我們將循環並打印數組元素,然后我們將釋放不再需要的內存。
#include <stdio.h>
#include <stdlib.h>
int *function(unsigned int tags) {
int i;
int *var = malloc(sizeof(int)*tags);
for (i=0; i < tags; i++) {
var[i] = i;
}
return var;
}
int main() {
int *x;
int i;
x = function(10);
for (i=0; i < 10; i++) {
printf("TEST: %i\n", x[i]);
}
free(x); x=NULL;
return 0;
}
在C中,函數不能返回數組類型。 出於您的目的,您希望返回指向int
的指針:
int *function(int a)
{
int *var = malloc(sizeof *var * tags); // where is tags defined?
// are you sure you don't mean a here?
...
return var;
}
這將分配一個足夠大的內存塊來保存tags
整數值,並將該塊的第一個元素的地址分配給var
。 請注意, var
是指向int
的指針,而不是指向int
數組的指針。 該指針是從函數返回的指針。
可以使用下標oprerator上的指針表達就好像它是一個數組,像這樣:
int a = ...;
int *arr = function(a);
...
arr[0] = 0;
arr[1] = 1;
...
arr
是一個指針表達式,而不是數組表達式,因此sizeof arr
將返回指針類型的大小,而不是它指向的內存塊的大小(因此,你需要跟蹤它的數量)你單獨分配的元素)。
怎么樣:
int* function(int tags){
int * var = malloc(sizeof(int)*tags);
//....
return var;
}
基本元素類型的數組和指針在C / C ++中(大多數)是同義的,因此您可以返回指向數組的第一個元素的指針,並將其用作數組本身。
注意,您的代碼有一個輸入參數a
,但使用tags
為數組分配內存。 我在上面的代碼中假設您希望為此目的使用輸入參數
此外,當您不再使用數組時,您必須在上面function
返回的指針上調用free()
,以避免內存泄漏。 malloc
上面分配的內存足以保存int
的tags
數,因此該數組相當於int var[tags];
更新:刪除了malloc
返回的malloc
在C中,數組與指向數組元素的指針基本相同。 所以char []基本上是char *
不要忘記跟蹤數組的大小,我也注意到標簽似乎是一個全局變量,大多數時候,避免全局變量是一個好主意
這是一些示例代碼:
#include <stdio.h>
#include <stdlib.h>
int* foo(size_t arrSize){
int* arr = (int*) malloc(sizeof(int)*arrSize);
return arr;
}
int main (int argc, char** argv){
printf("Printing array:\n");
int* arr = foo(42);
for(int i=0; i <42; i++){
arr[i]=i;
}
for (int i=0; i < 42; i++){
printf("Element: %d: %d\n", i, arr[i]);
}
free(arr);
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.