我最近开始学习C语言,我正在参加一个以C为主题的课程.我现在在玩循环,我遇到了一些奇怪的行为,我不知道如何解释.

#include <stdio.h>

int main()
{
  int array[10],i;

  for (i = 0; i <=10 ; i++)
  {
    array[i]=0; /*code should never terminate*/
    printf("test \n");

  }
  printf("%d \n", sizeof(array)/sizeof(int));
  return 0;
}

在我运行Ubuntu14.04的笔记本电脑上,这段代码不会中断.它将完成.在我学校运行CentOS 6.6的计算机上,它也运行良好.在Windows 8.1上,循环永远不会终止.

更奇怪的是,当我将for循环的条件编辑为:i <= 11时,代码只在运行Ubuntu的笔记本电脑上终止.它永远不会在CentOS和Windows中终止.

有人能解释内存中发生了什么,以及为什么运行相同代码的不同操作系统会产生不同的结果吗?

编辑:我知道for循环超出了范围.我是故意的.我只是不明白不同的操作系统和计算机之间的行为会有什么不同.

推荐答案

在我运行Ubuntu14.04的笔记本电脑上,这段代码不会中断它直到运行完成.在我学校运行CentOS 6.6的电脑上,它也运行得很好.在Windows 8.1上,循环永远不会结束.

更奇怪的是,当我将for循环的条件编辑为:i <= 11时,代码只在运行Ubuntu的笔记本电脑上终止.CentOS和Windows永不终止.

你刚刚发现了记忆的沉重.你可以在这里阅读更多信息:What is a “memory stomp”?

当分配int array[10],i;时,这些变量进入内存(具体来说,它们在堆栈上分配,堆栈是与函数相关联的内存块).array[]i在内存中可能彼此相邻.在Windows 8.1上,i似乎位于array[10].在CentOS上,i位于array[11].在Ubuntu上,这两个位置都没有(可能是array[-1]?).

try 将这些调试语句添加到代码中.您应该注意到,在迭代10或11中,i处有array[i]个点.

#include <stdio.h>
 
int main() 
{ 
  int array[10],i; 
 
  printf ("array: %p, &i: %p\n", array, &i); 
  printf ("i is offset %d from array\n", &i - array);

  for (i = 0; i <=11 ; i++) 
  { 
    printf ("%d: Writing 0 to address %p\n", i, &array[i]); 
    array[i]=0; /*code should never terminate*/ 
  } 
  return 0; 
} 

C++相关问答推荐

如何在不修改字符串缓冲区早期使用的情况下覆盖字符串缓冲区

位屏蔽对于无符号转换是强制的吗?

ATmega328P USART发送字符重复打印

在函数中使用复合文字来初始化C语言中的变量

从组播组地址了解收到的数据包长度

使用GOTO从多个嵌套循环C继续

struct -未知大小

C中的FREE函数正在触发断点

为什么未初始化的 struct 的数组从另一个数组获取值?

无法访问共享目标文件内的共享指针

为什么realloc函数在此代码中修改变量?

向左移位3如何得到以字节为单位的位数?

Matlab/Octave对conv2函数使用哪种方法?

I';我试着从.txt文件中读取文本,并用c计算其中的单词数量

令人困惑的返回和 scanf 问题相关

使用 strtok 多次分割一个字符串会导致意外行为

指向返回 struct 成员的指针,安全吗?

这些表达式是否涉及 C 中定义的复合文字?

如何为avr atmega32微控制器构建C代码,通过光电二极管捕获光强度并通过串行通信传输数据

保存有符号整数结果的变量是否会溢出(后增量的副作用),并且此后从未在任何表达式中使用过它,是否会导致 UB?