//自己探索的原因请高手指点:
//1.itoa() 不可能改变number 因为大家都知道c语言的参数传递是单向的
//2.string不会出错的原因可能是因为如果string空间如果不够 时
//剩余的是由itoa中通过malloc分配的。于是我把代码 char string[4] ;改为:
//char string[1] ;重新编译运行后string仍然是1234这说明string是有itoa分配的
//3.问题可能就出现在string是由itoa 分配的
//因为number是在编译时分配的内存 string是在运行时分配内存
//为了弄清原因我把代码改为
/*
#include<iostream.h>
#include<stdlib.h>
#include<stdio.h>
int main(void)
{
int number = 1234;
char string[1] ;
itoa(number,string,10);
printf("integer = %d string = %s\n",number,string);
int *p = &number;
printf("%d",p);//打印出number的地址
char *pc = string;
printf("\n%d",pc);//打印出string的地址
return 0;
}
//结果number的地址是1245052
string的地址是1245048
他们之间只有4个字节的距离
运行是string由itoa按要求分配5个字节所以就把number中的1245052这一个字节覆盖掉了
因为1234在内存中是00000000 00000000 00000100 11010010
又因为x86处理器是小端模式所以地址1245052存储的是11010010 因为被'\0'覆盖掉了
所以number就变成了00000000 00000000 00000100 00000000 于是number就等于1024了
为了验证这个结论,我把number = 123 结果不管string[]数组的大小怎样都不会出错
这说明只要number不超过4位数就不会发生内存覆盖现象 ,这与我的推断一致
还可以通过加一个变量来验证:
int number = 1234;
char string[1] ;
在他们之间加一个变量k
改为
int number = 1234;
int k = 0;
char string[1] ;
这样number的值也不会错
*/