[英]Where the char* is pointing to?
關於指針和內存分配,我有一些非常基本的問題。
在下面的代碼中,指針c
實際指向何處? 換句話說,字符串"xyz"
在哪里存儲在內存中(堆棧/堆等)?
當我不再使用它時,分配給a
內存位置將如何處理?
如果我取消注釋部分的注釋,代碼似乎可以很好地工作。 在這種情況下,內存發生了什么?
#include<stdio.h> main() { char *c; //c = (char *)malloc(2); c = "a"; c = "xyz" ; printf("%s",c); return 0; }
輸出:
xyz
編輯:
在閱讀了很少的答案並發表第一條評論之后,我想到了另一個問題:
在以下情況下,字符串將存儲在哪里?以后可以更改它們嗎?
char *c[] = {"a","xyz"};
具體細節取決於實現,但是在大多數常見實現中,文字字符串(例如"a"
和"xyz"
存儲在程序的文本部分中,例如實現程序的機器代碼。 分配a = "xyz";
將a
設置為指向內存中的該位置。
"a"
的內存不受影響。 但是,優化的編譯器可能會注意到在該分配和重新分配之間從未使用過c
,因此它可以簡單地忽略第一個分配,而根本不會為"a"
分配任何空間。
使用malloc()
分配的內存將保持分配狀態,直到程序結束。 在不釋放內存的情況下分配內存稱為“ 內存泄漏” ,您應嘗試避免這種情況。
1.在下面的代碼中,指針“ c”實際上指向何處?換句話說,字符串“ xyz”存儲在內存中(堆棧/堆等)在哪里?
會將xyz
放置在內存的只讀部分,並使c
成為指向該內存的指針,這是一個指向c
的指針類型的變量,稱為c
,該變量使用該未命名的只讀數組中第一個字符的位置進行初始化。 .you創建了自動存儲(通常稱為堆棧)。 在這里,您僅指向文本部分中的內存。
2.由於我不再使用分配給“ a”的內存位置了,該怎么辦?
根據您的代碼,您沒有分配任何內存,只是為它分配了字符串文字。如果分配,則需要釋放它。
3.如果我取消注釋部分的注釋,代碼似乎可以很好地工作。在這種情況下,內存發生了什么?
如果您取消注釋分配語句以分配內存,那么它也指向您的文字字符串,但是您需要釋放該內存。
現在為例
char *c[] = {"a","xyz"};
當您聲明和初始化單詞時,它將像其他任何自動數組一樣在堆棧上分配,並且其項將分配給指向每個字符串常量開頭的指針。此外,更改此字符串也可能是非法的。
“ xyz”和“ a”是字符串文字,通常在字符串表中可用。
打印“ xyz”,因為它最近已分配給該指針。
const char*
相同,因此您無法更改它(當然,您可以通過某種方式來操縱它,也許可以通過另一個指針進行操作)。 strcpy(c, "a");
產生相同的影響strcpy(c, "a");
因為您忽略分配的內存及其指針-您不會釋放它。 通常,如果不釋放內存,則什么也不會發生(我的意思是,在程序結束時,操作系統會自動釋放它),但是它將占用程序中的內存,因此,如果我要分配,則說1000000
字節(假設它成功),分配更多的堆內存將是一個問題:P
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.