int main()
{
char *arr="hello";
clrscr();
printf("%s",arr);
arr="";
printf("and %s",arr+2);
getch();
return 0;
}!
这段代码的输出: -为什么%s被视为字符。串为什么这样不寻常的行为指针
helloand ND%S
点击此处查看: -
http://ideone.com/TJzUvp
//为什么这个不寻常的行为与指针字符串?
int main()
{
char *arr="hello";
clrscr();
printf("%s",arr);
arr="";
printf("and %s",arr+2);
getch();
return 0;
}!
这段代码的输出: -为什么%s被视为字符。串为什么这样不寻常的行为指针
helloand ND%S
点击此处查看: -
http://ideone.com/TJzUvp
//为什么这个不寻常的行为与指针字符串?
您正在调用未定义的行为。
参考arr+2
设置arr=""
正在拾取任意一块内存(在这种情况下,您的一个字符串文字)。
当您运行内存布局使得恒定空字符串之后的字符串常量and %s
自带的程序。内存看起来是这样的:
. . . \0 a n d ' ' % s \0 . . .
当您指定空字符串a
,你让a
指向\0
字符。然后你计算一个+ 2,结果指向n
字符。
因此,当您解读+ 2为NULL结尾的字符串所得到nd %s
。
这是当然的,不确定的行为。许多编译器布置常量,以便它们按照使用它们的顺序排列:这里空字符串出现在and %s
之前。但是没有任何东西会强制编译器这样做,并且如果它以不同的方式布置内存,则会得到不同的结果。该计划甚至可能会崩溃。
没有创建一个指向字符串> ..你创造意味着全局变量的存储空间块,并constants..and使用指针指向block..You不能改变价值因为它是常量内存空间的一部分...你正在做的是重新分配指向另一个存储位置,并期待幸运地指向所需location..it不会总是发生
什么是你想怎么办??? arr + 2是无效位置 – 999k 2013-03-26 13:05:08
但为什么这种无效输出? 即使我这样做:arr =“y” 看到相同的输出 – 2013-03-27 13:51:18