c语言字符串内存分配小记

admin 2022年5月29日13:47:20评论17 views字数 1013阅读3分22秒阅读模式

一、疑问

有这样一道题:

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

运行代码,输入:

12345678
12345678

后,为什么输出的是:

word1=##word2=12345678

word1哪去了。

二、分析

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

 c语言字符串内存分配小记

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

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

 c语言字符串内存分配小记

由于只给了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("nword1 begin addr = %pn", word1); for(i=0;i<count;i++)< span=""></count;i++)<> { printf("word1[%d]=%c addr=%pn", i, word1[i], &word1[i]); } printf("n-------------------------------n"); printf("word2 begin addr = %pn", word2); for(i=0;i<count;i++)< span=""></count;i++)<> { printf("word2[%d]=%c addr=%pn", i, word2[i], &word2[i]); } printf("n-------------------------------n"); printf("word1=%s##word2=%sn", word1, word2); printf("0x0028FEB8=%cn", *(int*)0x0028FEB8); return 0; }

运行效果:

c语言字符串内存分配小记


原文始发于微信公众号(汇编语言):c语言字符串内存分配小记

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年5月29日13:47:20
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   c语言字符串内存分配小记http://cn-sec.com/archives/1064100.html

发表评论

匿名网友 填写信息