全局字符指针(C语言)

4

我刚开始学习C语言,正在通过创建小程序来学习。

现在,我正在创建一个需要使用结构体或全局变量的程序,因为稍后在我的函数中,我只想直接调用它们。

我不想使用结构体,因为我担心它会增加代码行之间的seg. fault机会。

我的问题是:这两个东西是一样的吗?

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

and

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

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

如果不行,有人能告诉我创建全局char指针的正确方法吗,而不需要我创建一个结构体吗?

2
struct不会增加段错误的机会,而全局变量会。 - Bryan Chen
@BryanChen 那是不是意味着如果我使用 char *trialOne,就更容易出现段错误? - John
1
如果你真的必须使数据全局可访问,把它们全部放入一个结构体中是更好的选择,因为这样它就在概念上成为了一个单一的全局变量,而不是一堆混乱的变量。并且结构体本身并没有鼓励段错误的特性——那纯粹是无稽之谈。 - Lee Daniel Crocker
@LeeDanielCrocker知道了。但是如果我使用结构体,我仍然需要一个函数来释放右侧吗? - John
如果您的结构包含指向某些内容(如字符串)的指针,则是的,您将不得不为它们分配内存,并在完成后释放它们。这与它们在结构外部时没有什么不同。而且Bryan是正确的 - 您的命名表明您确实想要一个数组。 - Lee Daniel Crocker
显示剩余4条评论
2个回答

4
如果变量构成了一个对象,您应该使用一个 struct
struct myTrialStruct{
    char *trialOne;
    char *trialTwo;
    char *trialThree;
} myGlobalVar;

只需在源文件的顶部编写此代码。 myGlobalVar 是一个类型为struct myTrialStruct的全局变量。

或者,如果这三个变量是序列的一部分,请使用数组:

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

使用struct并不会增加出现段错误的机会;而是那些粗心的指针操作导致出现问题。

同时,尽量避免使用全局变量。这样你的代码会变得非常杂乱无章,修复bug也会更加困难。


它们不是序列的一部分,只是为了在需要立即存储某些东西时提供给我。但我的思路正确吗? - John
考虑到名称,数组可能是合适的选择。 - Jonathan Leffler
2
@John:什么?不!不要随意创建全局变量。只有在确实需要变量存在的情况下才应该创建全局变量。尽可能使用函数内部的本地变量,或者函数参数。全局变量会带来麻烦,请尽可能避免它们的使用。 - Jonathan Leffler
@JonathanLeffler 好的,我现在明白了。谢谢。 - John

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;

你可以这样定义一个结构体类型的对象,例如:
struct myTrialStruct{
    char *trialOne;
    char *trialTwo;
    char *trialThree;
};

struct myTrialStruct hlobal_pointers;

既然我只处理一个文件,我想声明三个字符指针是安全的,对吧? - John
1
由于您只有一个文件,无需使用 extern - lost_in_the_source
@John 你是对的。在 main 函数之前简单地声明它们(不需要 extern 指示符)。 - Vlad from Moscow
好的,那很酷。我在代码的最后也需要进行解除分配吗? - John
1
@John 如果你使用标准的C函数malloc或calloc来分配内存,那么你需要调用free函数来释放已分配的内存。例如:trialOne = malloc(6); strcpy(trialOne, "Hello"); /./ free(trialOne); - Vlad from Moscow
1
你不能“释放”全局变量。但是,由于你有char *trialOne等变量,你可能已经使用了动态内存分配来分配它们所指向的空间。在这种情况下,最好在退出之前释放内存,但这并不是必须的(现代操作系统在程序退出时会自动释放内存;旧的操作系统——例如原始的AmigaOS——不会,但现在已经过时)。重要的是你知道内存是如何分配的,因为释放所有char *变量是不安全的;值必须是由malloc()或其同类函数返回的。 - Jonathan Leffler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接