繁体   English   中英

C语言中的全局变量数组

[英]Global Variable Array in C

我正在尝试创建一个全局数组,其大小由运行时的外部参数文件确定。

我已经看到了其他问题,并尝试:

int const Nt=1280;
double *Array = NULL;
Array = malloc(Nt * Nt * sizeof(double));

但是,出现以下错误:

错误:数组类型冲突

错误:初始化元素不是恒定的

如何创建这样的全局数组而无需每次需要更改其大小时都无需重新编译?

不允许在全局范围内分配。 您必须改为在函数中执行此操作。

int const Nt = 1280;
double *Array = NULL;

假设以上2条语句在全球范围内。 它们是初始化的示例,因为语句在声明本身处分配值。 在全局范围内允许这样做,并且初始化器可以是常量值,字符串文字或此时可以访问的其他变量。

const int Nt ; // Just declaration
Nt =  1280 ;   // Error. Assignment is not allowed at global scope.

const char* myName = "CHP" ;
int a[] = { 11,22,33,44,55 } ;

同样,在您的示例中, Array只是一个声明。 在函数中进行分配。

void assignArray() {

    Array = malloc(Nt * Nt * sizeof(double));

    // ...

    printf("%d", sizeof(Array)/sizeof(Array[0]); // Size which is nothing but Nt*Nt
                                                 // 0 to (Nt * Nt) - 1
}

并针对分段错误,发布更多代码。

全局函数初始化器必须直接编译到可执行文件中。 因此,它们不能包含任何在运行时更改的信息,也不能包含函数调用。 并且初始化程序必须与声明位于同一语句中。

作品:

int x = 1;

不工作:

int x;
x = 1;

如果您不能将初始值设定项放在函数中,则应将其移入该函数中。

在函数中进行初始化(例如在main()中):

int main() {
    Array = malloc(dim1 * dim2 * sizeof(double));
    ...
}
double *Array = NULL;

很好(只要您在编写前包含定义NULL的标头即可)。

Array = malloc(dim1 * dim2 * sizeof(double));

您说这会产生:

Error: Conflicting types for Array
Error: Initializer element is not constant

这是因为编译器向后弯腰以接受您的代码,并且设法将Array解释为“隐式int ”变量,就像您编写的那样:

int Array = ...

由于intdouble * ,因此会产生冲突的类型错误。

第二条消息告诉您,初始化程序(对malloc()的调用malloc()不是常量,并且函数外部的初始化程序必须是常量。 如果将行放置在函数内,则将有一个赋值(而不是初始化程序),并且代码可以,尽管更好地编写为:

if (Array == NULL)
    Array = malloc(dim1 * dim2 * sizeof(double));

您应该使用更严格的编译警告进行编译。 我得到:

$ cat x.c
#include <stdlib.h>
double *Array = NULL;
Array = malloc(23 * 37 * sizeof(double));
$ gcc -g -std=c99 -pedantic -Wall -Werror -c x.c
x.c:3:1: error: data definition has no type or storage class [-Werror]
x.c:3:1: error: type defaults to ‘int’ in declaration of ‘Array’ [-Werror]
x.c:3:1: error: conflicting types for ‘Array’
x.c:2:9: note: previous definition of ‘Array’ was here
x.c:3:9: error: initialization makes integer from pointer without a cast [-Werror]
x.c:3:1: error: initializer element is not constant
cc1: all warnings being treated as errors
$

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM