Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C中的函数声明全局数组_C - Fatal编程技术网

从C中的函数声明全局数组

从C中的函数声明全局数组,c,C,也许这个问题在某个地方有答案,但我找不到。我要声明全局数组。但是这个数组的大小取决于我的输入。我怎么做?谢谢 这个想法是: char* array[maxsize]; int main(){ int maxsize; scanf("%d",&maxsize); } 编辑:如果一个数组是二维数组怎么办 您所说的是动态分配,它与正常分配(发生在内存的不同部分)略有不同,要在C中实现这一点,您可以使用stdlib.h(记住要包含它)中的一个函数calloc,它接受两个参数:

也许这个问题在某个地方有答案,但我找不到。我要声明全局数组。但是这个数组的大小取决于我的输入。我怎么做?谢谢

这个想法是:

char* array[maxsize];

int main(){
    int maxsize;
    scanf("%d",&maxsize);
}

编辑:如果一个数组是二维数组怎么办

您所说的是动态分配,它与正常分配(发生在内存的不同部分)略有不同,要在C中实现这一点,您可以使用stdlib.h(记住要包含它)中的一个函数calloc,它接受两个参数:元素的数量和每个元素的大小,因此,假设您需要一个字符数组,代码将如下所示:

char *array;

int main(void)
{
  int maxsize;
  scanf("%d", &maxsize);
  array = calloc(maxsize, sizeof(char));
}

您会注意到,在数组声明之后没有[],这是因为它不是数组而是指针,但您仍然可以像数组一样访问索引。因此,如果数组中至少有2个元素,那么数组[1]仍然可以工作。

像这样使用
calloc

#include <stdio.h>
#include <stdlib.h>

char* array=NULL;

int main()
{
    int maxsize;
    scanf("%d",&maxsize);

    array = calloc(maxsize, sizeof(char));

    free(array);
    array = NULL;
}
#包括
#包括
char*array=NULL;
int main()
{
int-maxsize;
scanf(“%d”、&maxsize);
array=calloc(maxsize,sizeof(char));
自由(数组);
数组=空;
}
这会在应用程序堆上动态分配
maxsize
字符。请注意,需要调用
free
来释放动态分配。如果不这样做,则称为内存泄漏。在这个琐碎的程序中,如果不调用free,虽然它不会太严重


好的,从技术上讲,它不是一个数组,它是一个指针,但这两者基本上是可以互换的。对char数组使用
calloc
是一个好主意,因为所有值都初始化为0,如果在其中复制某个字符串,则该字符串已以零结尾。

声明一个指向char的全局指针,然后
malloc()
calloc()
存储。只要您在上面定义maxsize 128(或某个值),全局声明就没有问题。但是,请理解您正在创建指向char的指针数组。如果您的目的是一个全局字符串,那么最好声明一个指针并在
main
或其他函数中分配。数组的维数不是特别相关-N个维数只是意味着您必须分配一个N维数组。您正在考虑动态内存分配。正如@JohnH所建议的,使用动态内存分配函数的
malloc()
calloc()
realloc()
系列。感谢您的回答。据我所知,calloc函数在堆上分配,全局变量在数据或bss段上分配,对吗?那么这个方法在哪里分配内存呢?这是因为,在C中,数组表示法衰减为指针数学
a[5]
相当于
*(a+5)
。考虑到这一点,您可能不会完全惊讶地发现
5[a]
也是获取数组第5个元素的有效C语法,因为它会衰减为
*(5+a)
,这是相同的结果——尽管它的形式非常糟糕。谢谢您的回答。如果数组是2D数组呢?谢谢你的回答。如果数组是2D数组怎么办?@akiD然后使用循环动态分配第二维度中的每个条目。试着搜索关于这个的其他问题。然后你有几个选择。您可以分配一个指针数组,然后循环遍历它们并分配第二级项,或者只执行一个大的分配,您知道它足够大,并为每个元素计算到该数组中的偏移量。看见