簡體   English   中英

c 語言在 main() 內部初始化全局變量,在 main() 外部

[英]c-language initializing global variable inside main(), outside main()

  1. 在 main() 里面——沒有錯誤

    #include <stdio.h> #include <stdlib.h> #define MAX 4 typedef struct { int vertex; int **matrix; }graph; graph ygraph={.vertex=MAX}; int main() { ygraph.matrix=(int**)malloc(sizeof(int)*MAX*MAX); return 0; }
  2. 外部 main() -- 錯誤//

     #include <stdio.h> #include <stdlib.h> #define MAX 4 typedef struct { int vertex; int **matrix; }graph; graph ygraph={.vertex=MAX}; ygraph.matrix=(int**)malloc(sizeof(int)*MAX*MAX); int main() { return 0; }

有什么區別...? 我無法在 main() 之外初始化全局變量? 我認為兩者都沒有錯誤......

引用 cppreference.com 上 C 參考中的一段話

初始化靜態或線程本地存儲持續時間的對象時,初始化程序中的每個表達式都必須是常量表達式或字符串文字。

靜態對象(例如graph )的初始化程序必須在編譯時知道,因為這些變量的初始化內存在編譯器生成的對象文件中找到。 因此,它們不能包含函數調用。

$ cat a.c
int a = 7;
int b = 8;
int c = 9;

$ gcc -c a.c

$ objdump -t -s -j .data a.o

a.o:     file format elf64-x86-64

SYMBOL TABLE:
0000000000000000 l    d  .data  0000000000000000 .data
0000000000000000 g     O .data  0000000000000004 a
0000000000000004 g     O .data  0000000000000004 b
0000000000000008 g     O .data  0000000000000004 c


Contents of section .data:
 0000 07000000 08000000 09000000           ............

函數中的賦值在函數調用期間進行評估(如果有的話),因此可能包含函數調用。

靜態對象初始化器必須是常量表達式 函數調用不是一個如果它們

你的 malloc 也是錯誤的。 如果使用雙指針,則需要 malloc 指向 int 的指針,然后為每個分配的指針分配整數空間

可以使用非常量表達式初始化具有自動存儲持續時間的對象。

int *foo(size_t size)
{
    int *x = malloc(size * sizeof(*x));
    // some ops
    return x;
}

暫無
暫無

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

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