簡體   English   中英

函數與C中的返回類型數組

[英]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上面分配的內存足以保存inttags數,因此該數組相當於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM