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