C 数组赋值在越界时有效

标签 c arrays

<分区>

为什么以下代码在 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);
}

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

最佳答案

关于执行

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

如果 i 的值等于 10,您将面临 undefined behavior通过访问越界内存 [array[i]],结果是 undefined副作用之一是段错误。这不是必须

关于C 数组赋值在越界时有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28151096/

相关文章:

C:如何扩展可变长度字符串以设置长度

javascript - Array.includes() 在数组中查找对象

c - 字符串声明中 `char *str`和 `char str[]`的区别

javascript - 这是解决数组分区问题的正确方法吗?

c - c中函数的声明、调用和定义

c - 每次迭代都会替换索引中的值

c++ - 哪个更快,单个对象数组,还是多个数据属性数组?

javascript - 从 ng-repeat 获取实际的数组索引

c - 当在 0 索引处打印链表值时,会出现段错误。

c - Linux 内核 : get function address for kernel driver