簡體   English   中英

用指向int的指針初始化數組

[英]initialize the array with pointers to ints

嘿,我正在解決一個問題,這是我必須要做的:-

編寫一個名為initarray的函數,該函數將一個指向int的指針數組和一個表示該數組大小的int用作參數。 該函數應使用指向ints的指針(使用malloc)初始化數組,該指針的值與存儲指向它們的指針的數組索引相對應(存儲在數組索引2的指針應指向值為2的整數) 。

到目前為止,我已經寫了這篇文章,但是它給我一個錯誤“ [Error]可變大小的對象可能未初始化”,您能告訴我我在做什么錯嗎?

#include<stdio.h>
void initArray(int **a, int sz){
int i;
for (i = 0; i < sz; i++) {
a[i] = calloc (1, sizeof **a);
 *a[i] = i; 
    }
  } 
 int main(){
 const int Var = 10;
 int *array[Var] = {NULL};
 initArray(array,3);
 }

出於歷史原因,永遠不會將const變量的值視為C中的常量表達式

因此,如果將其用作數組維,則該數組是可變長度數組 ,並且不允許可變長度數組具有初始化程序。

一種尚未提及的解決方案是使用enum 枚舉器實際上是常量表達式,它們不像預處理器宏那樣遭受相同的“更大沖擊”問題:

int main()
{
    enum { Var = 10 };
    int *array[Var] = {NULL};
    initArray(array,3);
}

C沒有用戶定義類型的符號常量。 您遇到了與C ++的不同之一。

const限定符只是對編譯器的保證您將不會更改變量 (!) Var

具有初始化程序和全局數組的數組需要一個常量表示 ,可以在編譯時對其進行求值。 由於Var在語義上仍然是變量,因此無法使用它。

模擬符號常量的C方法是宏:

#define ARRAY_SIZE 10

...

// in your function:
int *array[ARRAY_SIZE] = ...

宏由預處理器處理,是實際編譯器看到代碼之前的文本替換。

請注意,我將名稱更改為更不言自明的名稱。 宏也應該在文件級別,通常在開始時就可以了,以便於修改。 直接在代碼中使用整數常量 10是一個壞主意。 當需要修改時,此類幻數通常會導致錯誤。

該錯誤表明您不能在可變大小的對象上使用初始化程序( main函數中的= {NULL} )。 雖然看起來它不是變量(由於Var上的const ,並且因為10是常量),但由於您正在通過變量訪問它,因此將其視為變量。 如果您使用:

int *array[10] = {NULL}

我認為您的代碼片段可以正常運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM