zoukankan      html  css  js  c++  java
  • c语言字符串内存分配小记

    一、疑问

    有这样一道题:

    #include "stdio.h"
    
    int main()
    {
        char word1[8];
        char word2[8];
        
        scanf("%s", word1);
        scanf("%s", word2);
        
        printf("word1=%s##word2=%s
    ", word1, word2);
        
        return 0;
    }

    运行代码,输入:

    12345678
    12345678

    后,为什么输出的是:

    word1=##word2=12345678

    word1哪去了。

    二、分析

    由于c语言局部简单变量是存在栈中,栈是先进后出的,所以先定义的变量在栈底。那么输入了word1后,内存中变量是下面这样的:

     

    我们可以看到,B8已经超出了word1定义的字符数组的范围。

    当word2输入后,内存中变量变成了这样的:

     

    由于只给了A8到AF共8个地址空间(由于最后一位要放字符串结束标志,所以实际只能用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("
    word1 begin addr = %p
    ", word1);
        for(i=0;i<count;i++)
        {
            printf("word1[%d]=%c addr=%p
    ", i, word1[i], &word1[i]);
        }
        
        printf("
    -------------------------------
    ");
        
        printf("word2 begin addr = %p
    ", word2);
        for(i=0;i<count;i++)
        {
            printf("word2[%d]=%c addr=%p
    ", i, word2[i], &word2[i]);
        }
        
        printf("
    -------------------------------
    ");
        
        printf("word1=%s##word2=%s
    ", word1, word2);
        
        printf("0x0028FEB8=%c
    ", *(int*)0x0028FEB8); return 0; }

    运行效果:

  • 相关阅读:
    zabbix监控部署(三)
    zabbix监控部署(二)
    zabbix监控部署(一)
    Docker安装mysql5.7
    Docker修改容器默认存储路径
    MySQL全量+增量备份脚本
    企业级Dokcer镜像仓库Harbor部署
    Linux环境pyhon3安装pyinstaller
    配置Hive元数据数据库为PostgreSQL
    Oracle 11gR2 RAC 添加节点
  • 原文地址:https://www.cnblogs.com/lurenjiashuo/p/c-string-memory.html
Copyright © 2011-2022 走看看