程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> c語言字符串內存分配小記,字符串分配小記

c語言字符串內存分配小記,字符串分配小記

編輯:關於C語言

c語言字符串內存分配小記,字符串分配小記


一、疑問

有這樣一道題:

#include "stdio.h"

int main()
{
    char word1[8];
    char word2[8];
    
    scanf("%s", word1);
    scanf("%s", word2);
    
    printf("word1=%s##word2=%s\n", word1, word2);
    
    return 0;
}

運行代碼,輸入:

12345678
12345678

後,為什麼輸出的是:

word1=##word2=12345678

word1哪去了。

二、分析

由於c語言局部簡單變量是存在棧中,棧是先進後出的,所以先定義的變量在棧底。那麼輸入了word1後,內存中變量是下面這樣的:

 

我們可以看到,B8已經超出了word1定義的字符數組的范圍。

當word2輸入後,內存中變量變成了這樣的:

 

由於只給了A8到AF共8個地址空間(由於最後一位要放字符串結束標志\0,所以實際只能用A8到AE),但輸入了8個字符,所以導致字符串結束標志寫入到了下一塊內存地址(也就是B0中)。

三、驗證

#include "stdio.h"

int main()
{
    char word1[8];
    char word2[8];
    
    scanf("%s", word1);
    scanf("%s", word2);
    
    int count = 8;
    int i;
    printf("\nword1 begin addr = %p\n", word1);
    for(i=0;i<count;i++)
    {
        printf("word1[%d]=%c addr=%p\n", i, word1[i], &word1[i]);
    }
    
    printf("\n-------------------------------\n");
    
    printf("word2 begin addr = %p\n", word2);
    for(i=0;i<count;i++)
    {
        printf("word2[%d]=%c addr=%p\n", i, word2[i], &word2[i]);
    }
    
    printf("\n-------------------------------\n");
    
    printf("word1=%s##word2=%s\n", word1, word2);
    
    printf("0x0028FEB8=%c\n", *(int*)0x0028FEB8); return 0; }

運行效果:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved