Проблемы с глобальным массивом не обновляются, C программирование - PullRequest
0 голосов
/ 08 января 2019

У меня есть программа, распределенная по нескольким файлам. Есть ряд функций, которым нужен доступ к глобальному массиву. У меня проблема в том, что я не знаю размер массива до запуска программы. Он открывает файл, а затем загружает несколько точек, а затем создается массив с соответствующим размером. Но для того, чтобы массив был глобальным, он должен быть объявлен вне основной функции, т. Е. Прежде чем я узнаю количество точек.

То, что я пытался сделать сейчас, это:

file1.c:

#include <stdio.h>
#include "file3.h"
int useful[];
int main()
{
    int useful[10];
    int i;

    for (i = 0; i < 10; i++) {
        useful[i] = i+1;
    }

    SPN();

    return 0;
}

file2.c:

#include <stdio.h>
#include "file3.h"

void SPN() {
    int i;
    for (i = 0; i < 10; i++) {
        printf("%i\n", useful[i]);
    }
}

file3.h:

extern int useful[];
extern void SPN();

То, что я получаю в выводе, это просто набор из 0. Сначала я думал, что второй int полезный [... в file1.c создает новый массив с другим внутренним именем, но это, кажется, не имеет никакого смысла, учитывая, что SPN () не вызывает ошибку сегментации, когда он пытается получить доступ к памяти за пределами массива (если полезно [] создает массив и не изменяется, он имеет размер по умолчанию 1, т.е. <10). Помогите? </p>

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Объявление useful внутри main является теневым внешним. Это означает, что значения, которые, по вашему мнению, вставляются (в main) в глобальную переменную, фактически входят в локальную переменную.

Посмотрите следующую статью о теневом копировании для получения дополнительной информации.

Также было бы интересно взглянуть на правила области видимости в C.

0 голосов
/ 08 января 2019

int useful[10]; не инициализирует глобальный int useful[]; или что-то в этом роде. Это новая переменная, с циклом здесь

for (i = 0; i < 10; i++) {
    useful[i] = i+1;
}

Вы модифицируете второй useful, не касаясь глобального. Это затем отбрасывается в конце функции.

Вместо этого используйте глобальную переменную, подобную этой:

int *useful;

И инициализировать это так:

useful = malloc(sizeof(int)*10);
...