gpt4 book ai didi

c - 声明指向数组的指针时,全局变量和局部变量有什么区别?

转载 作者:太空宇宙 更新时间:2023-11-04 07:14:19 26 4
gpt4 key购买 nike

我这样声明一个变量“ptr”:

int array[4][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}};
int n = 4;

int (*ptr)[n] = (int (*)[n])array[0];

放在global时编译程序报错:

error: variably modified ‘ptr’ at file scope
int (*ptr)[n] = (int (*)[n])array[0];
^

但是放到本地就成功了。

顺便说一句:我使用 gcc 编译器。

最佳答案

具有可变修改类型的变量只允许在 block 范围(即在函数内部)。

Variablely modified type 表示其中一个维度在编译时未知的数组类型,或从该数组派生的任何类型(例如指向此类数组的指针,如您的示例所示)。

int (*ptr)[n] 具有可变修改类型,因为 n 不是常量表达式。由于历史原因,const int n = 4; 也不算作常量表达式。但是 #define n 4 将是一个常量表达式。

一种解决方法是编写:

int (*ptr)[ sizeof array / sizeof array[0] ] = &array[0];   // note: no cast required

背景:在 C99 中添加了可变修改类型,以支持维度直到运行时才知道的数组。

虽然实际使用这样的数组由于堆栈溢出而存在风险,但这种语法可以实现一些不错的后续效果。例如,use array syntax with malloc'd arrays 的能力,以及具有可以使用数组语法对多维数组进行操作的函数的能力;但接受各种大小的数组。

关于为什么在文件范围内不允许使用它们的理由,see the answers to this question . (目前该问题被错误地作为重复问题关闭,但答案很好)

关于c - 声明指向数组的指针时,全局变量和局部变量有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26112496/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com