2015-10-29 3 views
4

Я только начинаю изучать язык C, создавая небольшие программы.Global Char Pointer (C Программирование)

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

Я предпочитаю не использовать конструкцию, потому что я боюсь, что это увеличит шанс на seg. ошибка где-то между строками кода.

Мой вопрос: эти два одинаковых?

struct myTrialStruct{ 
    char *trialOne; 
    char *trialTwo; 
    char *trialThree; 
}; 

и

extern char *trialOne; 
extern char *trialTwo; 
extern char *trialThree; 

char *trialOne; 
char *trialTwo; 
char *trialThree; 

Если нет, то может кто-нибудь сказать мне, как правильно создать глобальный указатель обугленного без меня, чтобы создать -структуру?

+0

Они не то же самое; «' '' '' ', а остальные три - нет. И использование структур не приводит к segfaults per se - неправильное использование структур может это сделать, но вы также можете получать segfaults от простых указателей символов. Именование означает, что вам нужен массив. В одном исходном файле вам нужен только 'static char * trialOne', - ничего больше его не будет использовать. В нескольких файлах вам понадобится заголовок, объявляющий 'extern char * trialOne;', и в одном файле у вас будет 'char * trialOne = 0;' (если вы разумны; 'char * trialOne;' также работает, но с большей вероятностью приведет к проблемам с Правилом Единого определения). –

+2

'struct' не увеличит шансов на сегмент. ошибка, глобальная переменная. –

+0

Существует чрезвычайно подробный (и обширный) ответ на вопрос [Как использовать 'extern' для обмена переменными между исходными файлами в C] (https://stackoverflow.com/questions/1433204/how-do-i-use-extern -в-шер-переменные-между-исток-файлы-в-с /); вы захотите прекратить чтение на первом или не позднее второго, где вам предлагается прекратить чтение. –

ответ

4

Вы должны использовать struct, если переменные составляют объект. Если они это сделают:

struct myTrialStruct{ 
    char *trialOne; 
    char *trialTwo; 
    char *trialThree; 
} myGlobalVar; 

Просто напишите это в верхней части исходного файла. myGlobalVar является глобальной переменной типа struct myTrialStruct.

Или, если три переменные являются частью последовательности использовать массив:

char *myGlobalArr[3]; // array of char * 

Использование struct не увеличит шансы Segfault; небрежные указатели.

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

+0

Они не являются частью последовательности, они просто там, чтобы предоставить мне, если мне нужно что-то немедленно запомнить. Правильно ли мой образ мышления? – John

+0

Учитывая имена, массив может быть уместным. –

+2

@John: что? Нет! Не создавайте глобальных переменных по прихоти на всякий случай. Создавайте глобальные переменные _only_, когда есть веская причина, почему переменная должна существовать. Вы должны использовать переменную, которая является локальной для функции или, возможно, аргументом функции, когда это возможно. Глобальные переменные приводят к проблемам - избегайте их, когда это возможно. –

4

Если у вас есть одна единица компиляции, достаточно разместить эти объявления вне любой функции.

char *trialOne; 
char *trialTwo; 
char *trialThree; 

Если вы собираетесь иметь несколько единицы компиляции, которые получат доступ этих указателей, то вы должны поместить эти объявления в заголовке

extern char *trialOne; 
extern char *trialTwo; 
extern char *trialThree; 

и в каком-то модуле, чтобы поместить эти определения указателей

char *trialOne; 
char *trialTwo; 
char *trialThree; 

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

Что касается вашего вопроса

Являются ли эти два то же самое?

тогда эти

struct myTrialStruct{ 
    char *trialOne; 
    char *trialTwo; 
    char *trialThree; 
}; 

тип декларации, что это представляет собой структуру декларации, ни один объект не будет создан.

в то время как эти декларации объектов

char *trialOne; 
char *trialTwo; 
char *trialThree; 

Вы могли бы определить объект типа структуры, например, folloiwng способ

struct myTrialStruct{ 
    char *trialOne; 
    char *trialTwo; 
    char *trialThree; 
}; 

struct myTrialStruct hlobal_pointers; 
+0

Поскольку я имею дело только с одним файлом, я уверен, что можно правильно объявить три указателя на символ? – John

+1

Поскольку у вас есть только один файл, не нужно использовать 'extern'. – stackptr

+0

@John Вы правы. Просто объявите их (без указателя extern) перед основным. –