簡體   English   中英

如何從帶有指針的函數返回數組

[英]How to return an array from a function with pointers

我試圖弄清楚如何從main()中的函數返回一個數組。

我正在使用C語言。

這是我的代碼。

#include <stdio.h>

int *initArray(int n){
    int i;
    int *array[n];

    for(i = 0; i < n; i++){
        array[i] = i*2; 
    }

    return array;
}

main(){
    int i, n = 5;
    int *array[n];

    array[n] = initArray(n);

    printf("Here is the array: ");

    for(i = 0; i < n; i++){ 
        printf("%d ", array[i]); 
    }

    printf("\n\n");
}

這是控制台給我的錯誤:

2.c: In function ‘initArray’:
2.c:8:13: warning: assignment makes pointer from integer without a cast [enabled by default]
    array[i] = i*2; 
            ^
2.c:11:3: warning: return from incompatible pointer type [enabled by default]
    return array;
    ^
2.c:11:3: warning: function returns address of local variable [-Wreturn-local-addr]
2.c: In function ‘main’:
2.c:23:4: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
    printf("%d ", array[i]); 
    ^

不可能! 我討厭做菜鳥:(

如果您能提供解釋,我將不勝感激! :d

編輯: iharob的答案比我的好。 先檢查他的答案。

編輯#2:我將嘗試解釋你的代碼錯誤的原因

考慮你問題中main()的第二行:

int *array[n];

讓我們試着向后看。

[n]

說我們有一個包含n個元素的數組。 我們不知道這些元素是什么類型以及數組的名稱是什么,但我們知道我們有一個大小為n的數組。

array[n] 

說你的數組叫做數組。

* array[n]

說你有一個指向數組的指針。 被指向的數組稱為“數組”,其大小為n。

int * array[n];

你說你有一個指向大小為n的整數數組的指針。

在這一點上,你是制作2d數組的3/4方法,因為2d數組包含一個指向數組的指針列表。 你不希望這樣。

相反,你需要的是:

int * array;

此時,我們需要檢查你的函數initArray:

int *initArray(int n){
    int i;
    int *array[n];

    for(i = 0; i < n; i++){
        array[i] = i*2; 
    }

    return array;
}

initArray的第二行與第二行main相同。 做了

int * array;

現在,這里有一個難以解釋的部分。

int * array;

不為數組分配空間。 在這一點上,它是一個不起眼的指針。 那么,我們如何為數組分配空間呢? 我們使用malloc()

int * array = malloc(sizeof(int));

僅為一個整數值分配空間。 此時,它更像是一個變量而不是一個數組:

[0]

int * array  = malloc(sizeof(int) * n);

為n個整數變量分配空間,使其成為一個數組:

例如n = 5:

[0] [0] [0] [0] [0]

注意:實數組中的值可能是垃圾值,因為與calloc不同,malloc不會將內存清零。 0是為了簡單起見。

但是,malloc並不總是有效,這就是為什么你需要檢查它的返回值:(如果不成功,malloc會使array = NULL)

if (array == NULL)
    return NULL;

然后,您需要檢查initArray的值。

#include <stdio.h>
#include <stdlib.h>
int *initArray(int n){
    int i;
    int *array = malloc(sizeof(int) * n);
    if (array == NULL)
        return NULL;

    for(i = 0; i < n; i++){

        array[i] = i*2; 
    }

    return array;
}

int main(){
    int i, n = 5;
    int *array = initArray(n);
    if (array == NULL)
        return 1;

    printf("Here is the array: ");

    for(i = 0; i < n; i++){ 
        printf("%d ", array[i]); 
    }
    free(array);

    printf("\n\n");
    return 0;
}

你不能只返回這樣的數組。 您需要創建一個動態分配的數組才能執行此操作。 另外,為什么你還使用二維陣列?

int array[5];

基本上(不完全)相同:

int * array = malloc(sizeof(int) * 5);

后者更靈活一點,你可以調整使用malloc分配的內存,你可以從函數返回指針,就像我發布的代碼一樣。 但要注意,因為動態內存分配是你不想進入的,如果你還沒准備好大量的痛苦和調試:)

另外,free()在你使用它之后已經malloc'd的任何東西,你應該在使用已經分配了它的指針之前檢查malloc()的返回值。

感謝iharob提醒我將其包含在答案中

你想初始化數組嗎? 你可以這樣試試。

#include <stdio.h>
void initArray(int *p,int n)
{
    int i;
    for(i = 0; i < n; i++)
    {
        *(p+i) = i*2; 
    }

}

void main(void)
{
    int i, n = 5;
    int array[n];

    initArray(array,n);

    printf("Here is the array: ");

    for(i = 0; i < n; i++)
    { 
        printf("%d ", array[i]); 
    }

    printf("\n\n");
}

如果您不想在學習malloc和動態內存分配時遇到麻煩,可以試試這個

#include <stdio.h>

void initArray(int n, int array[n]) {
    int i;

    for (i = 0 ; i < n ; i++) {
        array[i] = i * 2; 
    }
}

int main() { /* main should return int */
    int i, n = 5;
    int array[n];

    initArray(n, array);

    printf("Here is the array: ");
    for(i = 0 ; i < n ; i++) { 
        printf("%d ", array[i]); 
    }
    printf("\n\n");
    return 0;
}

如你所見,你不需要返回數組,如果你在main()聲明它,並將它傳遞給函數,你可以直接修改函數中的值。

如果你想使用指針,那么

#include <stdio.h>

int *initArray(int n) {
    int i;
    int *array;

    array = malloc(n * sizeof(*array));
    if (array == NULL) /* you should always check malloc success */
        return NULL;

    for (i = 0 ; i < n ; i++) {
        array[i] = i * 2; 
    }

    return array;
}

int main() { /* main should return int */
    int i, n = 5;
    int *array;

    array = initArray(n);
    if (array == NULL) /* if null is returned, you can't dereference the pointer */
        return -1;

    printf("Here is the array: ");
    for(i = 0 ; i < n ; i++) { 
        printf("%d ", array[i]); 
    }
    free(array); /* you sould free the malloced pointer or you will have a memory leak */
    printf("\n\n");

    return 0;
}

暫無
暫無

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

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