私はこのコードが間違っている理由を見つける作業があります。それがあることを私に語ったvalgrindのを使用することによりCの次のコードで何が問題なのかを理解しようとしています
#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);
}
printf("*b = %d\n", *b);
に失敗します。私はコメントによってそれに気づいたa[N] = 3;
valvgrindはエラーを出さない。しかし、なぜ私は理解していない。私はこれがメモリと関係があり、a[N]
は配列外の要素を要求することを知っています。
'main()'がないためですか? –
まあ、それを含めるべきでしょう、編集を見てください。 – Olba12