簡體   English   中英

char *指向的位置?

[英]Where the char* is pointing to?

關於指針和內存分配,我有一些非常基本的問題。

  1. 在下面的代碼中,指針c實際指向何處? 換句話說,字符串"xyz"在哪里存儲在內存中(堆棧/堆等)?

  2. 當我不再使用它時,分配給a內存位置將如何處理?

  3. 如果我取消注釋部分的注釋,代碼似乎可以很好地工作。 在這種情況下,內存發生了什么?

     #include<stdio.h> main() { char *c; //c = (char *)malloc(2); c = "a"; c = "xyz" ; printf("%s",c); return 0; } 

輸出:

 xyz

編輯:

在閱讀了很少的答案並發表第一條評論之后,我想到了另一個問題:

  1. 在以下情況下,字符串將存儲在哪里?以后可以更改它們嗎?

      char *c[] = {"a","xyz"}; 
  1. 具體細節取決於實現,但是在大多數常見實現中,文字字符串(例如"a""xyz"存儲在程序的文本部分中,例如實現程序的機器代碼。 分配a = "xyz"; a設置為指向內存中的該位置。

  2. "a"的內存不受影響。 但是,優化的編譯器可能會注意到在該分配和重新分配之間從未使用過c ,因此它可以簡單地忽略第一個分配,而根本不會為"a"分配任何空間。

  3. 使用malloc()分配的內存將保持分配狀態,直到程序結束。 在不釋放內存的情況下分配內存稱為“ 內存泄漏” ,您應嘗試避免這種情況。

1.在下面的代碼中,指針“ c”實際上指向何處?換句話說,字符串“ xyz”存儲在內存中(堆棧/堆等)在哪里?

會將xyz放置在內存的只讀部分,並使c成為指向該內存的指針,這是一個指向c的指針類型的變量,稱為c ,該變量使用該未命名的只讀數組中第一個字符的位置進行初始化。 .you創建了自動存儲(通常稱為堆棧)。 在這里,您僅指向文本部分中的內存。

2.由於我不再使用分配給“ a”的內存位置了,該怎么辦?

根據您的代碼,您沒有分配任何內存,只是為它分配了字符串文字。如果分配,則需要釋放它。

3.如果我取消注釋部分的注釋,代碼似乎可以很好地工作。在這種情況下,內存發生了什么?

如果您取消注釋分配語句以分配內存,那么它也指向您的文字字符串,但是您需要釋放該內存。

現在為例

char *c[] = {"a","xyz"};

當您聲明和初始化單詞時,它將像其他任何自動數組一樣在堆棧上分配,並且其項將分配給指向每個字符串常量開頭的指針。此外,更改此字符串也可能是非法的。

“ xyz”和“ a”是字符串文字,通常在字符串表中可用。

打印“ xyz”,因為它最近已分配給該指針。

  1. 到字符串所在的內存的只讀部分中堆/堆棧中的某個位置。直接將字符串文字分配給指針時,程序會在內存中搜索該字符串(如果通過簡短搜索找到該字符串)他在做,它會指向它,如果沒有,它將創建它。 無論哪種方式,它都是只讀的,因此它將與const char*相同,因此您無法更改它(當然,您可以通過某種方式來操縱它,也許可以通過另一個指針進行操作)。
  2. 沒什么,它不會受到影響。
  3. 發生的情況是malloc返回一個指針,而您只是忽略了它,便轉到了包含a的另一個地址,它將不會與strcpy(c, "a");產生相同的影響strcpy(c, "a"); 因為您忽略分配的內存及其指針-您不會釋放它。 通常,如果不釋放內存,則什么也不會發生(我的意思是,在程序結束時,操作系統會自動釋放它),但是它將占用程序中的內存,因此,如果我要分配,則說1000000字節(假設它成功),分配更多的堆內存將是一個問題:P
  4. 關於另一個問題...您無法通過該指針更改它們,請嘗試這樣做,它將在程序中間拋出一個中斷,並且可能會停止響應。

暫無
暫無

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

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