C 什么';当声明指向数组的指针时,全局变量和局部变量之间的区别是什么?

C 什么';当声明指向数组的指针时,全局变量和局部变量之间的区别是什么?,c,arrays,gcc,C,Arrays,Gcc,我声明一个变量“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]; 当将其放入全局时,我在编译程序时出错: error: variably modified ‘ptr’ at file scope int (*ptr)[n] = (int (*)[n])arr

我声明一个变量“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];
当将其放入全局时,我在编译程序时出错:

error: variably modified ‘ptr’ at file scope
 int (*ptr)[n] = (int (*)[n])array[0];
       ^
但当我把它放在本地的时候,它会成功的

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

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

可变修改类型是指在编译时其中一个维度未知的数组类型,或从该维度派生的任何类型(例如,指向此类数组的指针,如示例中所示)

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

解决方法之一是编写:

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

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

虽然由于堆栈溢出,实际使用这样的数组是有风险的,但是这种语法可以实现一些很好的后续效果。例如,能够使用数组语法对多维数组进行操作,并且能够拥有一个函数;但是可以接受不同大小的数组

有关为什么不允许在文件范围内使用它们的基本原理。(目前该问题被错误地作为重复问题关闭,但答案是正确的)

具有可变修改类型的变量仅允许在块范围内(即在函数内部)使用

可变修改类型是指在编译时其中一个维度未知的数组类型,或从该维度派生的任何类型(例如,指向此类数组的指针,如示例中所示)

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

解决方法之一是编写:

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

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

虽然由于堆栈溢出,实际使用这样的数组是有风险的,但是这种语法可以实现一些很好的后续效果。例如,能够使用数组语法对多维数组进行操作,并且能够拥有一个函数;但是可以接受不同大小的数组

有关为什么不允许在文件范围内使用它们的基本原理。(目前该问题被错误地作为重复问题关闭,但答案是正确的)

具有可变修改类型的变量仅允许在块范围内(即在函数内部)使用

可变修改类型是指在编译时其中一个维度未知的数组类型,或从该维度派生的任何类型(例如,指向此类数组的指针,如示例中所示)

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

解决方法之一是编写:

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

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

虽然由于堆栈溢出,实际使用这样的数组是有风险的,但是这种语法可以实现一些很好的后续效果。例如,能够使用数组语法对多维数组进行操作,并且能够拥有一个函数;但是可以接受不同大小的数组

有关为什么不允许在文件范围内使用它们的基本原理。(目前该问题被错误地作为重复问题关闭,但答案是正确的)

具有可变修改类型的变量仅允许在块范围内(即在函数内部)使用

可变修改类型是指在编译时其中一个维度未知的数组类型,或从该维度派生的任何类型(例如,指向此类数组的指针,如示例中所示)

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

解决方法之一是编写:

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

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

虽然由于堆栈溢出,实际使用这样的数组是有风险的,但是这种语法可以实现一些很好的后续效果。例如,能够使用数组语法对多维数组进行操作,并且能够拥有一个函数;但是可以接受不同大小的数组


有关为什么不允许在文件范围内使用它们的基本原理。(目前该问题被错误地作为重复问题关闭,但答案是正确的)

n的值也可以按如下方式计算,对吗#define n(sizeof(array)/sizeof(array[0])int(*ptr)[n]=&array[0]是的,
#define
只是一个文本替换。事实上,我只是在函数中使用它,就像这个void fun(int array[],int n])。但我真的不明白它是如何工作的?为什么我可以声明一个类型可变的变量?:)在函数参数列表中没有数组<代码>int数组[]
在羊皮中。是的。但我真的想知道为什么我不能在全局中使用它?n的值也可以按如下方式计算,对吗#define n(sizeof(array)/sizeof(array[0])int(*ptr)[n]=&array[0]是的,
#define
只是一个文本替换。事实上,我只是在函数中使用它,就像这个void fun(int array[],int n])。但我真的不明白它是如何工作的?为什么我可以声明一个类型可变的变量?:)在函数参数列表中没有数组<代码>整数数组[]
在羊的