试图理解C中的以下代码有什么问题

Olb*_*a12 1 c arrays

我有一个任务,找到这个代码错误的原因.

#include <stdlib.h>
#include <stdio.h>

#define fail(a)          ((test == 0 || test == a) ? fail##a() : 0)
#define N                (10)

int  a[N] = { 1 }; 
int* b = &a[0];


void fail1()

{
    printf("a[0] = %d\n", a[0]);
    printf("b[0] = %d\n", b[0]);
    printf("*b   = %d\n", *b);
    *b = 2;
    a[N] = 3;
    printf("*b = %d\n", *b);

}

...

int main(int argc, char **argv)
{
    int        test = 0;

    if (argc > 1) {
            sscanf(argv[1], "%d", &test);
            printf("doing test %d\n", test);
    } else
            puts("doing all tests");

    fail(1);
    fail(2);
    fail(3);
    fail(4);
    fail(5);
    fail(6);

    puts("lab6 reached the end");

    exit(0);
}
Run Code Online (Sandbox Code Playgroud)

通过使用valgrind它告诉我有一个失败printf("*b = %d\n", *b);.我注意到通过评论a[N] = 3;valvgrind没有错误.但我不明白为什么.我知道这与内存有关,我知道a[N]要求数组之外的元素.

Sou*_*osh 5

C数组具有基于0的索引.对于定义的数组a[N],最大有效元素将是a[N-1].

a[N]指向超出记忆的内容.尝试访问超出范围的内存,调用未定义的行为.

现在,虽然你可能知道上述事实,但你可能在UB的影响中忽略了什么.一旦你击中UB,没有任何保证.简单的解决方案,不要编写可以调用UB的代码.