【问题标题】:C array assignment works while out of bounds [duplicate]C数组赋值在越界时有效[重复]
【发布时间】:2015-01-26 13:33:44
【问题描述】:

为什么以下代码在i 到达14 之前有效(printf() 被执行)?实际上,当i 超过数组的第 10 个元素时,执行应该会失败,不是吗?即使我写:

  for(i=0; i<100; i++)

当然,我仍然遇到分段错误,但所有值都被打印出来了。

#include <stdio.h>

void funcX() {
    int i;
    int array[10];

    printf("\tEntering funcX()\n");

    //for(i=0; i<11; i++) { //This works
    //for(i=0; i<12; i++) { //This works
    //for(i=0; i<13; i++) { //This works
    for(i=0; i<14; i++) {   //***This fails****
        array[i]=i;
        printf( "array[i]= %d\n", array[i] );
    }

    printf("\tLeaving funcX()\n");
}

int main(int argc, char** argv) {
    printf("Calling funcX() from main()\n");
    funcX();
    printf("Returning from funcX()\n");
    return(0);
}

在 RH Linux 上使用 gcc -m32 编译。

【问题讨论】:

  • 你为什么要这样做?
  • 它恰好起作用。写入未分配的内存是未定义的行为。最终,你遇到了一个问题,它崩溃了。您不能依赖它在分配的内存之外工作;这只是基于您机器当前状态的侥幸。
  • 非常类似于Is accessing a global array outside its bound undefined behavior? ...您的答案就在那里,区别在于全局数组与自动数组,但其他方面基本相同。
  • 不禁止越界写,但会导致undefined behavior
  • 您处于未定义的行为领域!!请快速离开该区域!我重复“未定义的行为”! - 好的,严肃地说,这是未定义的行为,它可能会或可能不会起作用。阅读此stackoverflow.com/questions/2397984/…。也许您应该尝试使用 -Wall 开关进行编译

标签: c arrays


【解决方案1】:

关于执行

for(i=0; i<14; i++) { 

对于等于10i 的值,您将通过访问越界内存[array[i]] 来面对undefined behavior,其结果是,嗯,未定义副作用之一是分段错误。这不是必须

【讨论】:

  • array[13] 有一些特殊的东西导致了分段错误。
猜你喜欢
  • 2014-11-16
  • 2019-05-03
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 2016-02-17
  • 2015-12-07
  • 1970-01-01
  • 2015-06-28
相关资源
最近更新 更多