C++ sprintf的错误使用?

C++ sprintf的错误使用?,c++,c,printf,C++,C,Printf,我有一个简单的测试程序 #include <stdio.h> int main( int argc , char* argv[] ) { unsigned int number=2048; char* cpOut; char cOut[4]; cpOut=(char*)&cOut[0]; printf("cOut address= %x \n",&cOut[0]); printf("cpOut address = %x \n",cpOut)

我有一个简单的测试程序

#include <stdio.h>
int main( int argc , char* argv[] )
{
  unsigned int number=2048;

  char* cpOut;
  char cOut[4]; 
  cpOut=(char*)&cOut[0];
  printf("cOut address= %x \n",&cOut[0]);
  printf("cpOut address = %x \n",cpOut);

  sprintf(&cOut[0],"%d \n", number);

  printf("cOut address= %x \n",&cOut[0]);
  printf("cpOut address = %x \n",cpOut);
};

测试运行在Solaris 10,Sun C++ 5.10:

bash-3.00$ ./a.out
cOut address= 8047488
cpOut address = 8047488
cOut address= 8047488
cpOut address = 8000a20

有人能解释一下为什么调用sprintf函数会覆盖指针cpOut吗?

我认为这是一种缓冲区溢出的情况。尝试将cOut变大,同时用更安全的snprintf替换sprintf:

sprintf(&cOut[0],"%d \n", number);
应改为

snprintf(cOut,sizeof(cOut),"%d \n", number);
因为字符串
“2048\n”
不适合
字符[4],您正在创建缓冲区溢出。

您正在将7个字节(“2048\n”+NUL)写入堆栈上大小为4的数组中。这将覆盖堆栈上它下面的3个字节,在本例中为
cpOut
cpOut
的新值向您显示:第一个字节未更改0x08,接下来的3个字节是您正在写入的字符串的最后三个字节:00(NUL)、0a('\n')、20('')。

此行:

sprintf(&cOut[0],"%d \n", number);
写入7个字符:“2048\n\0”,但其中只有4个字符有空格。值0x8000a20包含(按相反顺序):空格、新行和字符0

sprintf(&cOut[0],"%d \n", number);