当前位置: 代码迷 >> C语言 >> [讨论]请你给出运行结果,并说明原因
  详细解决方案

[讨论]请你给出运行结果,并说明原因

热度:140   发布时间:2006-07-18 13:06:22.0
提示: 作者被禁止或删除 内容自动屏蔽

2006-07-18 05:06:22
wangsong

等 级:新手上路
帖 子:45
专家分:0
注 册:2006-7-15
  得分:0 
在VC6下,这个程序首先可以通过编译,其次可以正确运行,再次,它每次的运行结果不是随机的!
想想为什么?15楼的,you are right,but why?
----------------解决方案--------------------------------------------------------

#include<stdio.h>
main()
{
char str[20]="sdjhffdfdhfd";
printf("%c",str[21]);

}
编译运行通过,结果是这样的
。。
y


----------------解决方案--------------------------------------------------------

楼主的程序大家还是少运行为妙,随便改变未知存储单元的内容,这种风险太大.
至于楼上的,您的程序只是访问未知单元,但并未对其处理,风险不大。程序显示的之所以是乱码,是因为访问到了未知的单元,单元存储的8bit刚好是10011000,打印出其ASCii码对应的刚好是那个.
您运行的每次结果都是一样的,那是因为:编译器为那个字符串分配空间的位置跟上次程序是一样的(因为每执行完程序,字符串空间被释放),也就是说每次字符串的地址都是一样的。
可做如下检验:
#include<stdio.h>
main()
{
char str[20]="sdjhffdfdhfd";
printf("%x\n",str);
printf("%c",str[21]);

经运行,可知每次运行得到的地址都是一样的。


----------------解决方案--------------------------------------------------------

我有个问题 既然程序能运行 有什么问题能够防止这种情况发生呢?


----------------解决方案--------------------------------------------------------
这种情况?
----------------解决方案--------------------------------------------------------

#include<stdio.h>
#include<string.h>

int main()
{
int x = 10;
char c[10];
printf("%d\n", strlen( c ) );
strcpy( c, "1234567890987" );
printf("%d\n", x);

return 0;
}

此程序中strlen( c ) 计算的是字符串的长度,而char c[10];定义的是一个字符数组!故输出将有错!
将程序改为:
#include<stdio.h>
#include<string.h>

int main()
{
int x = 10;
char *c;
c="adljdfgdfgf";
printf("%d\n", strlen( c ) );
strcpy( c, "1234567890987" );
printf("%d\n", x);

return 0;
}
所求长度将是c="adljdfgdfgf";所给的具体长度!


----------------解决方案--------------------------------------------------------
  相关解决方案