一般变量内存分配问题
写了段检测代码:程序代码:
#include<stdio.h> #include<string.h> void main() { int x=35; //电脑为变量分配是址由高地址向低地址分配 char str[10]; strcpy(str,"www.\n");/*共14个字母*/ printf("sizeof(int)=%d",sizeof(int)); printf("\nx=%d",x); printf("\nstrlen(str)=%d\n",strlen(str)); printf("\n'o'=%d",'o'); printf("\n*(str+10)=%d",*(str+10)); printf("\n\n'r'=%d",'r'); printf("\n*(str+10)=%d",*(str+11)); printf("\n\n'g'=%d",'g'); printf("\n*(str+10)=%d",*(str+12)); printf("\n\n&x = %d",&x); //输出x的地址 printf("\n&str[9] = %d",&str[9]); //输出数组最后一个元素的地址 printf("\n&str[0] = %d\n\n",&str[0]); //输出数组第一个元素的地址 printf("%d\n",str[13]); //输出字符串最后一个元素的值 printf("%d\n\n",&str[13]); //输出字符串最后一个元素的地址 }运行结果:
在说一下我的分析吧:(我的机子在为局部变量分配内存时由高地址向低地址分配)
int型变量x占 4字节:1245053--1245050
char型数组str占10字节: 1245049--1245040(在这里要注意下,1245040为数组第一个元素地址,1245049为最后一元素地址)
结构:
前面4字节为int变量x的单元:
第一格地址:1245053,存储'\n'
第二格地址: 1245052, 存储'g'
第三格地址: 1245051, 存储'r'
第四格地址: 1245050, 存储'o'
好,现在问题来了:在我输出x的地址时,程序输出的是1245052,不是1245053;
在我输出x的值时 ,程序输出的是2663。注意到,
'\n'阿斯科玛为10, 换成2进制;0000 1010 ;
'g' 阿斯科玛为103,换成2进制;1011 0111 ;
读取x时为2663,对应2进制;0000 1010 1011 0111;
也就是说输出了1245053-1245052两字节的内容,但int在这里占4字节,后两字节被丢弃了。
有知道的高手吗