簡體   English   中英

了解C語言中的內存訪問

[英]Understanding memory access in C

考慮以下:

int i;
i = 12;

這顯然不會給出任何錯誤。 但是,可以做到以下幾點:

int *i;
*i = 12;

Program received signal:  “EXC_BAD_ACCESS”.

為什么我無權修改整數? 它仍然在進程的地址空間中嗎?

您無需為整數分配內存,只需創建一個指針即可。 即,當您嘗試訪問指針指向的任何值以設置該值時,指針不會指向任何有效的已分配內存。

如果您想學習C,則必須在此基本級別上了解內存。我建議您購買C書的簡介,或在線查找教程。 這里是許多起點之一: http : //www.cprogramming.com/tutorial/c-tutorial.html

您錯過了一步。 當你說:

int *i;

您擁有的是一個指向整數的指針。 現在,它並沒有特別指向任何整數,這就是為什么您不能取消引用它並更改值。 您需要將i設置為:

int j = 5;
i = &j;

現在, i是一個指向j的值( i )的指針。您現在可以更改該值:

*i = 6; // j (which i points to) is now 6

為了增加已經提到的答案,您要么需要將指針指向某個東西,要么為該指針分配內存,以便在內存中有指向的空間。 你可以這樣做:

int *i;
i = malloc(sizeof(int));
if(i == NULL) // or if(i == 0) or if(NULL == i) or whatever you prefer
    fprintf(stderr,"Some error blah blah\n")
*i = 5;
printf("i = %d\n",*i);

那也行得通。 只要確保這樣做后是否使用malloc測試空指針,否則如果由於某種奇怪的原因而無法分配int所需的內存,則可能會在以后遇到問題。

不,當您聲明一個指針而不為其分配內存時,就不能保證指向該進程的地址空間中的有效地址。 例如,假設它是一個32位指針,那么您的假設將意味着每個進程都有4 GB的可用內存。 但是您的計算機甚至可能沒有4 GB的物理內存。 分配內存時實際發生的情況是設置了CPU或虛擬內存硬件,以便可以將程序中的虛擬地址轉換為物理內存地址。 您可以在Wikipedia中了解有關虛擬內存的更多信息,請參閱http://en.wikipedia.org/wiki/Virtual_memory

暫無
暫無

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

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