2013-03-26 51 views
-1
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

//为什么这个不寻常的行为与指针字符串?

+0

什么是你想怎么办??? arr + 2是无效位置 – 999k 2013-03-26 13:05:08

+0

但为什么这种无效输出? 即使我这样做:arr =“y” 看到相同的输出 – 2013-03-27 13:51:18

回答

1

您正在调用未定义的行为。

参考arr+2设置arr=""正在拾取任意一块内存(在这种情况下,您的一个字符串文字)。

1

当您运行内存布局使得恒定空字符串之后的字符串常量and %s自带的程序。内存看起来是这样的:

. . . \0 a n d ' ' % s \0 . . . 

当您指定空字符串a,你让a指向\0字符。然后你计算一个+ 2,结果指向n字符。

因此,当您解读+ 2为NULL结尾的字符串所得到nd %s

这是当然的,不确定的行为。许多编译器布置常量,以便它们按照使用它们的顺序排列:这里空字符串出现在and %s之前。但是没有任何东西会强制编译器这样做,并且如果它以不同的方式布置内存,则会得到不同的结果。该计划甚至可能会崩溃。

+0

+1为解释结果得到了! – 999k 2013-03-26 13:11:26

+0

但是为什么它总是从字符串采取的printf()的?? .. 我的阵列ARR =“”不指向第一个索引(“\ 0” ACC。到u)中的printf字符串 – 2013-03-29 14:27:26

+0

没有的,它指向在'printf'的参数之前的0字节,这会产生一个空字符串。如果你添加一个“a + 1”,你会得到一个超过零的字节的地址,它是'a'。如果你加两个“a + 2”,你会得到'n'的地址。理解? – Joni 2013-03-29 16:10:16

0

没有创建一个指向字符串> ..你创造意味着全局变量的存储空间块,并constants..and使用指针指向block..You不能改变价值因为它是常量内存空间的一部分...你正在做的是重新分配指向另一个存储位置,并期待幸运地指向所需location..it不会总是发生