C言語のメモリ

プログラム命令およびデータ。

ハイからローアドレスに5つのゾーンに分け、C言語のメモリは、それぞれのスタック、ヒープ、グローバルエリア(静的領域)、および定常領域コード領域に対処します。

スタック領域(スタック):ローカル関数の変数、関数のパラメータを格納し、値を返すには、システムによって自動的に管理されます。

ヒープ(ヒープ):その後、malloc関数のメモリによって割り当てられた空きメモリを解放します。

グローバル領域(静的領域):グローバル変数と静的変数(静的)、グローバル変数および(.DATA)、初期化されていないグローバル変数及び(.bssの)領域に格納されて初期化されていない静的変数に格納された静的変数の初期化を記憶します。

定常領域:文字列定数の「Hello World」(文字列定数は、配列を初期化するために使用される場合、文字列は定常領域でないが、対応する配列に)、グローバル変数が変更されCONST

(.rodataのセグメント)に記憶されています。

コードエリア:関数のバイナリコード(テキスト)。コード領域に割り当てられたメモリのセクションであれば、この領域は、書き込みに読み取ることができません。

成長方向:低アドレス方向に高いからアドレス・スタックの成長は、低いから上位アドレス方向への成長を積み重ねます。

INT メイン(){    
     char型 [] = " Hello Worldのを" 
    printf(" \ nのアドレスが0X%のP、%sである" 、A)。    
    [ 3 ] = ' A ' 
    printf(" \ nのアドレスが0X%のP、%sである" 、A)。
    リターン 0 ; 
}

スタックに格納された配列の「Hello World」、その値を変更することができます。

int main(){    
    char *a="hello world";     
    printf("\nthe a address is 0x%p,%s",a,a);    
    a[3]='a';
    printf("\nthe a address is 0x%p,%s",a,a);
    return 0;
}

"hello world"存于常量区,指针a存于栈中。a指向"hello world"的首地址,由于“hello world"为常量所以不能被修改。

char c[]="hello world"; 
int main(){    
    printf("\nthe c address is 0x%p,%s",c,c);
    c[3]='a';
    printf("\nthe c address is 0x%p,%s",c,c);
    return 0;
}

数组c存放于全局区(静态区),所以数组的值可以被修改。

char *c="hello world"; 
int main(){    
    printf("\nthe c address is 0x%p,%s",c,c);
    c[3]='a';
    printf("\nthe c address is 0x%p,%s",c,c);
    return 0;
}

"hello world"存在于常量区,而指针c存在于全局区(静态区):常量不可以被修改。

int main(){    
    char a[]="hello world"; 
    char c[]="hello world"; 
    char *p ="hello world"; 
    char *d ="hello world"; 
    printf("\nthe a address is 0x%p,%s",a,a);
    printf("\nthe c address is 0x%p,%s",c,c);
    printf("\nthe p address is 0x%p,%s",p,p);
    printf("\nthe d address is 0x%p,%s",d,d);
    return 0;
}

上面的程序说明在常量区只保留一份相同的数据。

 

おすすめ

転載: www.cnblogs.com/ligei/p/11364784.html