[英]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.