为什么我可以将65535 + 1转换为C++中的有效int?

n0p*_*0pe -3 c++ integer overflow

我有一个非常简单的程序:

int main()
{
  char* num = new char[5];
  sprintf(num, "65536");
  std::cout << "atoi(num): " << atoi(num) << "\n";
}
Run Code Online (Sandbox Code Playgroud)

无符号INT的最大大小为65535.为什么运行时该程序不会溢出atoi(65536)

Dan*_*_ds 5

在当前的PC系统中,a int通常是32位甚至64位(除了一些较小的平台,如Arduino).

因此,可能在您的系统上,int(或unsigned int)大于16位,65536不应溢出.您可以通过以下方式轻松检查:

std::cout << sizeof(int) << "\n";
Run Code Online (Sandbox Code Playgroud)

此外,numnull终止符没有空格:

char* num = new char[5];
sprintf(num, "65536");
Run Code Online (Sandbox Code Playgroud)

因此sprintf()\0在缓冲区之外写一个终止的,导致未定义的行为:

没有办法限制写入的字符数,这意味着使用的代码sprintf容易受到缓冲区溢出的影响.

这应该改为:

char* num = new char[6];
Run Code Online (Sandbox Code Playgroud)