[英]Incrementing array variables inside and outside main function in C language
[英]c-language initializing global variable inside main(), outside main()
在 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; }
外部 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.