通过char指针输出不正确

int*_*075 0 c arrays string pointers

看下面的程序

int main()
{
 char p[3]="bug";
 puts(p);
 char *a=p;
 puts(a);
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

对于第一次投注,我得到正确的输出(即)"bug"
但是对于第二次投注,我输出为"bug↓"

  1. 为什么在末尾附加第二个输出垃圾值?
  2. char*a指向与char p [3]相同的内存位置.为什么它无法检测结束'\ 0'?

cni*_*tar 5

要存储"bug"+ 0终止符,你需要4个字符,你只分配3.尝试:

char p[] = "bug";
Run Code Online (Sandbox Code Playgroud)

我怀疑第一个puts有效,因为编译器做了一些有趣的事情,可以检测大小.

nmichaels有一个更好的解释:第一个有效,因为char *a在堆栈上的char [3]之后.空终止符成为a的初始值,只要保持未初始化,p结束为零.

  • 第一个是有效的,因为`char*a`紧跟在堆栈上的`char p [3]`之后.null终止符成为`a`的初始值,只要`a`保持未初始化,`p`就会以零结束.这不是你可以依赖的行为.从技术上讲,行为是不确定的. (4认同)