| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1439 人关注过本帖
标题:请高手指导这是怎么回事
只看楼主 加入收藏
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
int number = 1234;
char string_0[4];  
char string[4];
char string_1[4];

这样再试试,越位而已,不同的编译会有不同的结果

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2008-04-15 13:39
SNAKEQX
Rank: 1
等 级:新手上路
帖 子:112
专家分:3
注 册:2006-4-11
收藏
得分:0 
我试了一下,郁闷了。
int num=1234;
char str[4];
itoa (num, str, 10);
出来结果是1234
但是改成str[2];
结果也是1234
编译器dev-cpp

[[it] 本帖最后由 SNAKEQX 于 2008-4-15 14:06 编辑 [/it]]
2008-04-15 14:02
SNAKEQX
Rank: 1
等 级:新手上路
帖 子:112
专家分:3
注 册:2006-4-11
收藏
得分:0 
不过如果是123456677程序就崩溃了,哈哈:)还是越界问题。我觉得。
2008-04-15 14:07
yxwsbobo
Rank: 5Rank: 5
等 级:职业侠客
帖 子:345
专家分:306
注 册:2007-10-29
收藏
得分:0 
知道1024的原因了
printf("integer = %d ", number);
printf("string = %s\n",string);

这样肯定就不会错

原因在于 printf是从右网左计算的,  既然string出了问题 所以会影响到number的输出

How are you 怎么是你?
How old are you   怎么老是你?
2008-04-15 14:11
fanchunwei
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-11-8
收藏
得分:0 
//自己探索的原因请高手指点:
//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的值也不会错
*/
2008-04-15 21:21
快速回复:请高手指导这是怎么回事
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011953 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved