簡體   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