int main()
{
char *arr="hello";
clrscr();
printf("%s",arr);
arr="";
printf("and %s",arr+2);
getch();
return 0;
}!
此代码的输出: -
helloand nd%s
在这里查看: -
http://ideone.com/TJzUvp
//为什么这个指针字符串的异常行为?
答案 0 :(得分:1)
您正在调用未定义的行为。
在设置arr+2
后正在拾取任意内存(在这种情况下,是一个字符串文字中的一段),请参阅arr=""
。
答案 1 :(得分:1)
当你运行程序时,内存被布局,以便常量字符串and %s
在常量空字符串之后。内存看起来像这样:
. . . \0 a n d ' ' % s \0 . . .
将空字符串分配给a
时,会使a
指向\0
字符。然后计算一个+ 2,结果指向n
字符。
因此,当您将+ 2解释为以NUL结尾的字符串时,您会得到nd %s
。
这当然是未定义的行为。许多编译器都会按常规顺序排列常量:这里空字符串出现在and %s
之前。但没有什么能迫使编译器这样做,如果它以不同的方式布局内存,你会得到不同的结果。该计划甚至可能崩溃。
答案 2 :(得分:0)
您没有创建指向字符串的指针> ..您在内存空间中创建了一个用于全局变量和常量的块...并使用指针指向该块。您无法更改该值,因为它是CONSTANT内存空间的一部分...你正在做的是将指针重新分配给另一个内存位置,并期望幸运地指向一个理想的位置..它不会总是发生