C - 在函数中初始化全局数组

问题描述:

我有一个数组,我想使全局,我想在函数调用初始化。 我想首先声明它不知道它的大小:C - 在函数中初始化全局数组

char str[]; 

后来初始化:

str = char[size]; 

我怎样才能做到这一点? 我对c很陌生,也许我在这里完全错误的方式,任何帮助将不胜感激。

要做到这一点的方法是malloc。在init函数,你malloc

char *str; 

然后:一是申报只是一个指针

str = malloc(sizeof(*str) * size_of_array); 

这是分配点str向(在这种情况下char)大小的size_of_array元素。

你应该检查分配失败:

if (str == NULL) { 
    // allocation failed 
    // handle the error 
} 

通常你必须确保你free这个分配的内存当你用它做。但是,在这种情况下,str是全局的,所以它不会超出范围,程序结束时内存将为freed。

+4

在C,你真的不应该投malloc的结果 - 你只有在C++中真的需要这么做 - 它应该在C中避免,因为它可以屏蔽其他有用的警告。 – 2010-11-21 21:06:18

+2

如果你想成为一般的,使用'sizeof(* str)',所以你不必重复类型名称。此外,在C中,您不应该投射malloc的结果。 – 2010-11-21 21:06:31

+2

@Paul,@Ben:谢谢,我更新了anwer – 2010-11-21 21:08:12

char* str; 

str = (char*)malloc(size*sizeof(char)); 

根据定义,您可以跳过*sizeof(char),因为sizeof(char) == 1

不要忘了取消分配使用free

+2

如果您想成为一般人,请使用'sizeof(* str)',这样您就不必重复类型名称。此外,在C中,您不应该投射malloc的结果。 – 2010-11-21 21:06:10

+1

在C中,你不应该真的投射malloc的结果 - 你只需要在C++中做到这一点 - 它应该避免在C中,因为它可以屏蔽否则有用的警告。 – 2010-11-21 21:06:53

创建char* str;而不是数组的内存。然后,使用malloc或calloc分配所需的内存量,并在函数调用中进行初始化。

让您的全局数组声明是这样的:

char *str = NULL; 
在你的初始化函数

然后做这样的事情:

void init(int size) 
{ 
    ... 
    str = malloc(size * sizeof(char)); 
    ... 
} 
+1

'sizeof(char)'的定义是1。如果你想编写适用于任何类型的代码,可以使用'sizeof(* str)'。 – 2010-11-21 21:08:59

+0

@Ben:true,但无论类型如何,包含'sizeof'都是一个好习惯。我很清楚支持'sizeof(* str)'的参数,但在这种情况下我仍然更喜欢'sizeof(char)'。 – 2010-11-21 21:11:28