Вы можете использовать только один класс хранения за раз - поэтому вы не можете использовать оба static
и extern
для определения одной переменной.
Для динамически размещаемых массивов важно знать, какой код освободит выделенное пространство. Если вы этого не сделаете, у вас будет утечка памяти. В небольших программах это может не иметь значения в том смысле, что программа будет работать, несмотря на утечку памяти. Однако в больших программах, особенно в долго работающих программах (текстовые процессоры, СУБД и т. Д.), Это имеет решающее значение.
Вы можете передать динамически размещенные массивы - или указатель на динамически распределенный массив - другой функции. Если вы не хотите, чтобы другая функция изменяла его, вам следует написать другую функцию, чтобы она принимала const SomeType *arg
в качестве аргумента. Затем компилятор гарантирует, что ваш код не изменяет массив.
Таким образом:
header.h
extern void func2(const char *filename);
extern void func1(void);
a.c
#include "header.h"
#include <stdlib.h>
#include <string.h>
extern const char *other_file_name; // Should be in a header!
void func1(void)
{
char *filename;
size_t N = strlen(other_file_name) + 1;
filename = (char *)malloc(N);
strcpy(filename, other_file_name);
file_name[N-1] = '\0';
file_name[N-2] = 'x';
func2(filename);
free(filename);
}
b.c
#include "header.h"
void func2(const char *filename)
{
...operations on filename...
}
main.c
#include "header.h"
int main(void)
{
...
func1();
...
func2("/etc/passwd");
return 0;
}
В качестве альтернативы, но менее желательно, вы можете сделать filename
глобальной переменной. В этом случае вы должны объявить это в header.h
. Однако вы не можете заставить компилятор применять ограничение, согласно которому func2()
должен рассматривать переменную как константу - еще одна причина не использовать глобальные переменные.
См. Также SO 1433204 для обсуждения extern
переменных в C.