[英]Pointer Assignment, malloc() and free() in C
我是C編程的新手,我正在玩malloc()
, free()
和Pointer Assignment,以便更好地掌握它。
這是我的代碼:
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
void
array_fill(int * const arr, size_t n)
{
size_t i;
for (i = 0; i < n; i++)
arr[i] = i;
}
void
array_print(const int * const arr, size_t n)
{
size_t i;
for (i = 0; i < n; i++)
printf("%d ", arr[i]);
printf("\n");
}
int
main(int argc, char ** argv)
{
int * p1, * p2;
p1 = (int *) malloc(SIZE * sizeof(int));
p2 = p1;
array_fill(p1, SIZE);
array_print(p1, SIZE);
array_print(p2, SIZE);
printf("\nFREE(p1)\n");
free(p1);
array_print(p2, SIZE);
return (0);
}
使用gcc test.c -o test
編譯並使用./test
運行它:
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
FREE(p1)
0 0 2 3 4 5 6 7 8 9
p2 = p1
,是否意味着p2
指向與p1
相同的值? p1
為什么我仍然可以打印p2
(索引1的值不同)? 我是否導致任何內存泄漏或指針懸空? p1
被釋放,這是正常的能夠打印p2
嗎? 1)是的
2)您正在訪問釋放的內存,這是一件壞事。
3)行為未定義。 它可以工作,它可能會崩潰,它可能會打印垃圾,它可能會把我們都吸進黑洞(雖然不太可能)
p2 = p1
,是否意味着p2
指向與p1
相同的值?
是的,在賦值后,兩個指針都指向同一個內存區域。
釋放
p1
為什么我仍然可以打印p2
(索引1的值不同)? 我是否導致任何內存泄漏或指針懸空?
是的,一旦你釋放p1
, p2
指針就會變得晃來晃去。 通過它訪問任何內容都是未定義的行為。
即使p1被釋放,這是正常的能夠打印p2嗎?
不,這是未定義的行為。
不要讓你看到的數字看起來像你之前曾混淆過你的數字:任何與你之前被稱為free
的數字相似的事情都是完全巧合。 不幸的是,像這樣的巧合使懸垂指針的問題極難找到。 為了解決這個問題,內存分析器程序接管了free
-d區域,並故意在其中寫入一些垃圾值。 這使得檢測更快,但它不是防彈的。
1)存儲在指針中的值是存儲器地址。 這意味着,具有相同值的兩個指針指向相同的地址,這意味着相同的內存區域。
2)解放了指針p1
只設置的值p1
以NULL
和說,指向的內存由p1
是免費使用的,它不再保留。 但它並沒有抹去記憶。 它仍然保持着它的價值。 但是通過另一個仍然具有地址的指針訪問它是一個未定義的行為,因為它可以保留給另一個東西。
3)是的,這是正常的,因為它已在(2)中解釋過; 存儲區域不被擦除或設置為0
秒, p2
仍指向地址,這意味着它仍然打印相同的值
注意,如果稍后由malloc
保留存儲器區域,則如果修改存儲器區域,則打印p2
可以打印另一個值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.