Следующий код, приводящий к ошибке мусора или нарушения прав доступа, почему это так ...? - PullRequest
2 голосов
/ 28 апреля 2011

file1.c

int a[3]={1,39,7}; /* definition */

file2.c

extern int a[]; /* declaration */
b = a[2]; /* correct usage in file2.c */

file3.c

extern int *a; /* another declaration */
c = a[1]; /* a[1] is *(a+1), fails! */

Использование в file2 получает третий элемент (7) из a, но использование в file2 интерпретирует 39 как адрес (при условии 32 битовые целые числа и адреса), в результате чего либо мусор или ошибка нарушения прав доступа, почему это так ...?

1 Ответ

7 голосов
/ 28 апреля 2011

Посмотрите на этот ответ в C FAQ.int *a и int a[] - это не одно и то же!

РЕДАКТИРОВАТЬ: Изменено из ответа там:

В одном исходном файле вы определили массив целых, а в другом выобъявил указатель на целые числа[...] Тип указатель на тип-T не совпадает с массивом типа-T.

РЕДАКТИРОВАТЬ # 2: Чтобы увидеть, что происходит, посмотрите на этот ответ .Соответствующие части, измененные в соответствии с вашим образцом:

a 2 [ в file2.c ] - два места после (начало) объектас именем a, в то время как a 1 [ в file3.c ] - это одно место после объекта, на который указывает a.

Так что в file3.c этополагает, что указатель является разыменованным.Поскольку на самом деле это сам массив, разыменование происходит в другом месте, что приводит к нарушению доступа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...