为什么%s被视为字符。为什么字符串的这种异常行为作为指针

时间:2013-03-26 13:00:22

标签: arrays pointers

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

//为什么这个指针字符串的异常行为?

3 个答案:

答案 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内存空间的一部分...你正在做的是将指针重新分配给另一个内存位置,并期望幸运地指向一个理想的位置..它不会总是发生