Изменение значения внешней переменной

У нас есть в File1.c

int arr[10];

И в File2.c

extern int *arr;

int main()

{
   arr[0]=10;
   return 0;
}

Какие проблемы могут возникнуть с этим и почему?

Ответы на вопрос(3)

int arr[10]; форма,arr сам не занимает место памяти; это просто значение адреса, которое можно определить о ремя соединения. предполагатьarr 100;arr[0] значение адресе памяти 100

extern int *arr; форма,arr сама переменная памяти. Предположим, что обр состаляет 100,arr[0] значение адресе памятиptr, то ремя какptr значение ячейки памяти по адресу 100

EDIT

Asm, сгенерироанный gcc, дает глубокое понимание:

extern int a[10];
extern int *b;

int foo(void)
{
    return a[3] + b[5];
}

_foo:
    pushl   %ebp
    movl    %esp, %ebp

    movl    _b, %eax /* 1st memory load for pointer */
    addl    $20, %eax
    movl    (%eax), %eax /* 2nd memory load for pointer  */

    addl    _a+12, %eax /* only one memory load for array */

    popl    %ebp
    ret
 11 июл. 2012 г., 18:18
С использованием<kbd> ... </kbd> нотация для окружающего кода неортодоксальна. Пожалуйста, используйте обычную нотацию code-in-back-ticks.
Решение Вопроса

ВFile1.c, у вас есть макет памяти:

+---+---+---+---+---+---+---+---+---+---+
+ 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
+---+---+---+---+---+---+---+---+---+---+
^
arr

ВFile2.cВы сказали компилятору, что у вас есть структура памяти:

+-------+
|  ptr  |
+-------+
^
arr

где указатель предположительно указывает где-то, что может быть сохранено целое число.

Компилятор должен делать все по-другому, чтобы получить доступextern int *arr; отextern int arr[];.

Как написано, наиболее вероятным результатом является сбой, поскольку компилятор разыменовывает нулевой указатель. Поведение не определено, и все возможно. Вы солгали компилятору; компилятор получит свой собственный ответ & # x2014; это не нравится, когда лгут.

arr определен как массив, поэтому объявите его как массив.

extern int arr[10];   // file2.c

Если вы этого не сделаете, ваша программа вызывает неопределенное поведение.

 Luv11 июл. 2012 г., 15:48
Но почему так происходит, что если мы объявляем это как указатель, то неопределенное поведение?
 11 июл. 2012 г., 15:51
Поскольку эти два типа различны, и C говорит, что если вы не используете правильный тип, ваша программа вызывает поведение.

Ваш ответ на вопрос