簡體   English   中英

C中的指針賦值,malloc()和free()

[英]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
  1. p2 = p1 ,是否意味着p2指向與p1相同的值?
  2. 釋放p1為什么我仍然可以打印p2 (索引1的值不同)? 我是否導致任何內存泄漏或指針懸空?
  3. 即使p1被釋放,這是正常的能夠打印p2嗎?

1)是的

2)您正在訪問釋放的內存,這是一件壞事。

3)行為未定義。 它可以工作,它可能會崩潰,它可能會打印垃圾,它可能會把我們都吸進黑洞(雖然不太可能)

p2 = p1 ,是否意味着p2指向與p1相同的值?

是的,在賦值后,兩個指針都指向同一個內存區域。

釋放p1為什么我仍然可以打印p2 (索引1的值不同)? 我是否導致任何內存泄漏或指針懸空?

是的,一旦你釋放p1p2指針就會變得晃來晃去。 通過它訪問任何內容都是未定義的行為。

即使p1被釋放,這是正常的能夠打印p2嗎?

不,這是未定義的行為。

不要讓你看到的數字看起來像你之前曾混淆過你的數字:任何與你之前被稱為free的數字相似的事情都是完全巧合。 不幸的是,像這樣的巧合使懸垂指針的問題極難找到。 為了解決這個問題,內存分析器程序接管了free -d區域,並故意在其中寫入一些垃圾值。 這使得檢測更快,但它不是防彈的。

  1. 是的,p2指向與p1相同的區域。
  2. 顯然,內存已被釋放,但它尚未被重用(但是,一個值已經被覆蓋)。 釋放內存后,您不應該通過另一個指針訪問它。
  3. 它可能導致未定義的行為。 在你的情況下,它打印出損壞的數組。 它也可能因分段錯誤(如果內存頁不再屬於您的應用程序)而崩潰。 行為可能會根據操作系統,編譯器和其他內容而改變,因此最好避免這種做法。

1)存儲在指針中的值是存儲器地址。 這意味着,具有相同值的兩個指針指向相同的地址,這意味着相同的內存區域。

2)解放了指針p1只設置的值p1NULL和說,指向的內存由p1是免費使用的,它不再保留。 但它並沒有抹去記憶。 它仍然保持着它的價值。 但是通過另一個仍然具有地址的指針訪問它是一個未定義的行為,因為它可以保留給另一個東西。

3)是的,這是正常的,因為它已在(2)中解釋過; 存儲區域不被擦除或設置為0秒, p2仍指向地址,這意味着它仍然打印相同的值

注意,如果稍后由malloc保留存儲器區域,則如果修改存儲器區域,則打印p2可以打印另一個值。

暫無
暫無

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

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