为什么我没有得到SIGSEGV?

我想了解这里发生了什么,更准确地说,为什么我在写入内存位置时没有收到分段错误,根据我的理解,没有分配。

假设我想定义一个int的二维数组( testptr )。 一维( 4 )静态分配(作为“数组”),第二维( 2 )动态分配(作为“指针”)。

 // First dimension 4 rows static int *testptr[4]; for (i=0; i<4; i++) testptr[i] = calloc(2, sizeof(int)); // Second dimension 2 columns "dynamically" (in this example it is really just a constant) 

现在我写信给一些地方:

 testptr[0][0] = 5; testptr[1][0] = 6; testptr[2][1] = 7; testptr[3][1] = 7; 

以上所有我希望工作正常,因为它们在4×2“arrays”内。

现在我写一个不应该分配的位置:

 testptr[2][3] = 8; 

并确保我写信给他们中的许多人:

 for (i=0; i<1000; i++) testptr[3][i] = i; 

在这些都没有我得到分段错误或其他错误。

  1. 说我们正在写未分配的内存是否正确?
  2. 我们没有收到错误,这只是运气吗,因为其他变量/进程没有保留那些未分配的内存位置?
  3. 我们可以假设这样做会导致程序其他方面的问题(段错误)吗?

谢谢你的回答。

您的程序调用未定义的行为 。 它会给出预期或意外的结果。 无法保证访问数组越界会产生分段错误,否则会导致硬盘崩溃!