簡體   English   中英

C從函數返回數組

[英]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()的原因。

這里有很多錯誤。

  1. 函數multiply_by_2的返回類型必須為int* -即指向整數的指針。 實際返回的是指向數組第一個元素的指針。

  2. 您試圖返回在堆棧上初始化的變量( num_set )。 這將盡快消失multiply_by_two函數退出,因為它是一個自動變量 相反,應該使用malloc函數分配堆內存。 這是解釋堆棧和堆內存之間區別的鏈接

  3. 您有一個> ,在main中的for循環中應該有一個< 如所寫,循環將立即退出。

  4. 次要點-數字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 *類型。
  • 您正在將指針返回到自動局部變量。
  • mainfor循環中的第二個表達式不會讓循環主體執行。

將函數的返回類型更改為int *並使用動態分配。

int* multiply_by_2(int given_number)
{
     int* num_set = malloc(sizeof(int)*10);
     // rest of you code
}

最后將mainfor循環中的第二個表達式更改為main_counter < 10 main使用free釋放已分配的內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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