堆、棧知識點

來源:互聯網
上載者:User
代碼

#include <iostream>
using namespace std;
void main()
{
   char *c1 = "abc";
   char c2[] = "abc";
   char *c3 = ( char* )malloc(3);
   c3 = "abc";

   //*c1 = "aaa";                
   //strcpy(c3,"aaa");
   //c3[0] = 'g';
   // 此處c1、c3均指向字元常量區,c3以前指向在堆上分配的3個位元組
   // 的空間,但是此語句執行後,c3被重新導向,指向了文字常量區,c3指標變數(4位元組)本身在堆棧內。    
   // 執行c3="abc"; 後,不可以採用c3[1] = ‘x’修改字串了。因為文字常量去的字串是不能修改的。

   printf("%d %d %s\n",&c1,c1,c1);
   printf("%d %d %s\n",&c2,c2,c2);
   printf("%d %d %s\n",&c3,c3,c3);
   getchar();

 運行結果
  2293628 4199056 abc
  2293624 2293624 abc
  2293620 4199056 abc

  char *c1 = "abc"; 實際上先是在文字常量區分配了一塊記憶體放"abc",然後在棧上分配一地址給c1並指向這塊地址,然後改變常量"abc"自然會崩潰。然而char c2[] = "abc",實際上"abc"儲存的地方和上者並不一樣,它也在棧上。可以從4199056 2293624看出,完全是兩塊地方,推斷4199056處於常量區,而2293624處於棧區。
   從2293628 2293624 2293620 這段輸出看出三個指標分配的地區為棧區,而且是從高地址到低地址。
   從2293620 4199056 abc 看出編譯器將c3最佳化成,C1指向的常量區的同一個 "abc"。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.