一千萬個為什麽

搜索

為什麽我們使用帶指針數組的靜態?

為什麽我們使用帶指針數組的靜態?靜態指針與指針數組之間有什麽關系?

例如:

int main()
{
  int a[]={1,2,3};
  int *p[]={a,a+1,a+2}; 
  ......
  return 0;
}

此代碼顯示非法初始化 - 為什麽?以下代碼有效:

int main()
{
   static int a[]={1,2,3};
   static int *p[]={a,a+1,a+2}; 
   ...
   return 0;
}

最佳答案

在C89(原始“ANSI C”)中,初始化列表中使用的值必須是“常量表達式”。一種常量表達式是地址常量,指向具有靜態存儲持續時間的對象的指針是地址常量。

但是,指向具有自動存儲持續時間的對象的指針是地址常量(其值在編譯時是未知的),因此不能在初始化列表中使用。

您只需要使數組 a 具有靜態存儲持續時間 - 以下內容也可以使用:

main()
{
  static int a[]={1,2,3};
  int *p[]={a,a+1,a+2}; 
  ......
}

C99放寬了對具有自動存儲持續時間的對象的初始化的限制(這就是為什麽gcc可以使用它)。


為什麽會這樣?初始化列表通常用於初始化可能較大的對象,如數組或結構。每次輸入函數時,必須重新初始化具有自動存儲持續時間的對象,並且C89規則允許編譯器寫入通過發出簡單的 memcpy()調用來執行此初始化(使用作為源靜態“模板”) “,對應於初始化列表)。根據C99規則,編譯器可能必須發出任意復雜的初始化代碼塊。

轉載註明原文: 為什麽我們使用帶指針數組的靜態?