Глобальный статический (или нестатический?) массив символов (буфер) с доступом из всех файлов c

У меня есть файл заголовка, "temp.h" и несколько файлов ".c", в каждом из которых есть операторы заголовка "#include <temp.h>". И я определяю глобальный массив статических символов в файле «temp.h» следующим образом:

темп.ч

  static char buffer[1000] = {'A','B','C','\0'};

main.c

...
#include <temp.h>

int main()
{
  strcpy(buffer,"xyz");
  printf("\nBuffer : %s",buffer);
  func();
  return 0;
}

другое.с

...
#include <temp.h>

int func()
{
  printf("\nInside func(), buffer : %s",buffer);
  return 0;
}

и я компилирую все файлы с помощью следующей команды:

  gcc -o output.o main.c other.c

И я не получаю ошибок... и когда запускаю программу "output.o", Я ожидаю такого результата:

 Buffer : xyz                     // Buffer was intentionally changed inside main
 Inside func(), buffer : xyz

но я получаю:

 Buffer : xyz                     // Buffer was intentionally changed inside main
 Inside func(), buffer : ABC      // doesn't get updated buffer content- why?

Почему, когда я изменяю содержимое «(предположительно) глобального» статического массива символов в одном файле внутри любой области действия (основной или любой другой), это изменение не отражается на всех будущих ссылках этого массива символов из любого другого файла позже, а вместо этого в каждом файле((а может внутри в каждой функции) сохраняется его содержимое??

Как сделать так, чтобы я мог использовать определенную часть массива символов (область памяти), которая ГЛОБАЛЬНО доступна из всех «файлов» и в их функциях, и все ссылки получают правильные показания?

спасибо

Есть 2 разных buffer[] как они есть static. Изменение одного не меняет другого. Не используйте static, если вам нужен только 1 buffer[].

chux - Reinstate Monica 22.12.2020 10:37

@chux-ReinstateMonica, но если я удалю статическое ключевое слово, я получаю такую ​​​​ошибку для каждого файла или каждой функции, которые ссылаются на эту переменную. /usr/bin/ld: /tmp/cc3GK74t.o:(.data+0x0): multiple definition of `buffer'; /tmp/cc9HtEQv.o:(.data+0x0): first defined here collect2: error: ld returned 1 exit status

mikkins 22.12.2020 10:46

совет: не объявляйте данные в файлах заголовков. Скорее объявите «внешний тип dataName». Затем поместите фактическое объявление данных в один (только один) из файлов *.c.

user3629249 23.12.2020 18:48
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
3
313
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

С вашим текущим подходом у вас есть две копии массива. Вместо этого вам нужно объявить массив в temp.h (с extern вместо static) и определить его в другом месте, например, в in temp.c:

темп.ч:

#ifndef TEMP_H
#define TEMP_H

extern char buffer[1000];

#endif

темп.с:

#include "temp.h"

char buffer[1000] = "ABC";

Вы также можете найти для модуля более описательное имя, чем temp. Также рекомендуется добавить префикс к переменной буфера, например. temp_buffer, чтобы избежать возможных конфликтов имен и облегчить себе и другим поиск места объявления массива.

При замене ключевого слова static на extern... Получил еще больше ошибок и предупреждений, таких как: ` предупреждение: формат '%s' ожидает соответствующий аргумент 'char *' [-Wformat=] 560 | fprintf(stderr, "%s буфер здесь:%s \n",buffer );| /usr/bin/ld: /tmp/cckjaWGL.o: в функции 'main': temp.c:(.text+0x26a): неопределенная ссылка на 'buffer' collect2: ошибка: ld вернул 1 статус выхода`

mikkins 22.12.2020 11:00

@mikkins Если у вас есть два %s в строке формата, вам нужно указать две строки после строки формата.

August Karlstrom 22.12.2020 11:05

%s->%n была моей опечаткой... ВСЕ ТАКИЕ ОШИБКИ, даже такое же предупреждение о несоответствии буфера как char*....

mikkins 22.12.2020 11:12

Хорошо ... ПОНЯЛ! ... теперь я решил!

В отдельно включенном заголовочном файле ((о котором идет речь temp.h)) вы должны написать: extern char buffer[];

Примечание: однократное включение этого файла temp.h может быть достигнуто с помощью пар "#ifndef-#endif" в других файлах ".c" и ".h" компиляции.

И далее включите только в один из файлов следующее определение определения:

char buffer[1000];

Я надеюсь, что это решение поможет некоторым ребятам.

Другие вопросы по теме