簡體   English   中英

函數始終返回指向null的指針

[英]Function always returns pointer to null

為什么createArray函數將指針返回0? 我想我應該使用malloc來修復它,但是為什么呢?

   int *createArray(int size)
{
    int i;
    int arr[size];

    i = 0;
    while (i < size)
    {
        arr[i] = i;
        i++;
    }
    return arr;
}

int main()
{
    int *ar;
    printf("%i", (createArray(10)));
}

arr變量分配在堆棧上。 從函數返回時,將釋放堆棧。 然后,您返回的指針將指向一個無效的內存位置,該位置可能設置為null。

從函數返回數組時,實際上是在返回指向數組第一個元素的指針。 當函數返回時,其局部變量使用的內存不再有效。

因此,您將返回一個不再存在的變量的指針。 以任何方式使用該指針都將導致未定義的行為 在這種特殊情況下,無效地址可以被取消引用並恰好包含值0,但是不能保證在更改程序時行為將保持一致。

為此,您需要動態分配內存。 然后可以在程序的整個生命周期內使用它。

int *arr = malloc(sizeof(*arr) * size);

這也意味着您在使用free該內存后需要free該內存:

int *ar = createArray(10);
printf("%i", ar[0]);
free(ar);

基本問題是您的函數正在返回局部變量的地址。 函數返回后,該局部變量將不再存在,因此指向它的任何指針都是無效的。

為了更正您的代碼中的某些問題,我在頂部添加了#include <stdio.h>printf必需),並將您的printf調用從

printf("%i", (createArray(10)));

printf("%p\n", (void*)createArray(10));

當我用gcc編譯並運行程序時,輸出為:

(nil)

表示您的函數正在返回空指針。 (這不是“指向null的指針”;該指針 null。)這不是我期望的; 我期望一個無效的垃圾指針值。 (當我使用tcc而不是gcc時,我得到0x7fffd95a7140 。)

顯然,gcc識別出您的代碼具有未定義的行為,並將return語句替換為return NULL;等效項return NULL; 這是一個完全合法的轉換(它可能會阻止您的程序使用無效的指針進行令人討厭的操作,從而修改程序不擁有的內存)。

底線:您的程序具有未定義的行為,並且您無法假設其將執行的操作。 是的,使用malloc分配數組並返回分配的數組的地址是修復它的一種方法。

暫無
暫無

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

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