C 为什么将数组作为参数传递时只有一个自由维度?

C 为什么将数组作为参数传递时只有一个自由维度?,c,arrays,free,dimension,C,Arrays,Free,Dimension,在阅读C教程时,我遇到了一些非常奇怪的事情(至少对我来说是这样): void foo(char arr[]){ } void main(){ char old_buffer[100]; foo(old_buffer); //Working??! char arr2[] = old_buffer; //Error! } 带有错误注释的行对我来说很清楚,旧的缓冲区被当作地址处理,所以这无法工作,因为数组缺少应该分配多少内存的信息。但是为什么这在函数的

在阅读C教程时,我遇到了一些非常奇怪的事情(至少对我来说是这样):

void foo(char arr[]){

}


void main(){

  char old_buffer[100];

  foo(old_buffer);           //Working??!
  char arr2[] = old_buffer;  //Error!


}
带有错误注释的行对我来说很清楚,旧的缓冲区被当作地址处理,所以这无法工作,因为数组缺少应该分配多少内存的信息。但是为什么这在函数的头部起作用呢?
感谢您的支持:)

old\u buffer
old\u buffer[0]
的地址,也就是说,它是
old\u buffer[0]
char arr[]
相当于
char*arr

old\u buffer
old\u buffer[0]
的地址,也就是说,它是
old\u buffer[0]
char arr[]
相当于
char*arr

old\u buffer
old\u buffer[0]
的地址,也就是说,它是
old\u buffer[0]
char arr[]
相当于
char*arr

old\u buffer
old\u buffer[0]
的地址,也就是说,它是
old\u buffer[0]
char-arr[]
相当于
char*arr

带有错误注释的行对我来说很清楚,旧的缓冲区被当作地址处理,所以这无法工作,因为数组缺少应该分配多少内存的信息

这很接近,但这并不完全是事实:带有错误的行在语法上是不正确的——如果您将其更改为

char *arr2 = old_buffer;
它会起作用的。但是,这不是一个数组,而是一个指针。它将允许类似数组的访问,但不会在
sizeof
中为您提供正确的值

但是为什么这在函数的头部起作用呢

因为当您将数组传递给函数时,总是忽略大小。据说数组衰减为指针。换句话说,您的声明与此相同:

void foo(char *arr)
带有错误注释的行对我来说很清楚,旧的缓冲区被当作地址处理,所以这无法工作,因为数组缺少应该分配多少内存的信息

这很接近,但这并不完全是事实:带有错误的行在语法上是不正确的——如果您将其更改为

char *arr2 = old_buffer;
它会起作用的。但是,这不是一个数组,而是一个指针。它将允许类似数组的访问,但不会在
sizeof
中为您提供正确的值

但是为什么这在函数的头部起作用呢

因为当您将数组传递给函数时,总是忽略大小。据说数组衰减为指针。换句话说,您的声明与此相同:

void foo(char *arr)
带有错误注释的行对我来说很清楚,旧的缓冲区被当作地址处理,所以这无法工作,因为数组缺少应该分配多少内存的信息

这很接近,但这并不完全是事实:带有错误的行在语法上是不正确的——如果您将其更改为

char *arr2 = old_buffer;
它会起作用的。但是,这不是一个数组,而是一个指针。它将允许类似数组的访问,但不会在
sizeof
中为您提供正确的值

但是为什么这在函数的头部起作用呢

因为当您将数组传递给函数时,总是忽略大小。据说数组衰减为指针。换句话说,您的声明与此相同:

void foo(char *arr)
带有错误注释的行对我来说很清楚,旧的缓冲区被当作地址处理,所以这无法工作,因为数组缺少应该分配多少内存的信息

这很接近,但这并不完全是事实:带有错误的行在语法上是不正确的——如果您将其更改为

char *arr2 = old_buffer;
它会起作用的。但是,这不是一个数组,而是一个指针。它将允许类似数组的访问,但不会在
sizeof
中为您提供正确的值

但是为什么这在函数的头部起作用呢

因为当您将数组传递给函数时,总是忽略大小。据说数组衰减为指针。换句话说,您的声明与此相同:

void foo(char *arr)

c/c++中的数组在MEM中用作顺序指针列表。 数组名是保存数组中第一个元素地址的变量。 当我们使用索引到达存储在此索引位置的值时 编译器知道,值存储在MEM位置,等于 存储在由索引值添加的数组名称中的地址。 例:

char*arr2=旧缓冲区;将在您的代码中工作,并且您可以将arr2作为数组处理 因为它保存了MEM中预定位数组的第一个元素的地址。
这种编译器方式是让代码在函数头部工作的原因。

c/c++中的数组在MEM中作为顺序指针列表工作。 数组名是保存数组中第一个元素地址的变量。 当我们使用索引到达存储在此索引位置的值时 编译器知道,值存储在MEM位置,等于 存储在由索引值添加的数组名称中的地址。 例:

char*arr2=旧缓冲区;将在您的代码中工作,并且您可以将arr2作为数组处理 因为它保存了MEM中预定位数组的第一个元素的地址。
这种编译器方式是让代码在函数头部工作的原因。

c/c++中的数组在MEM中作为顺序指针列表工作。 数组名是保存数组中第一个元素地址的变量。 当我们使用索引到达存储在此索引位置的值时 编译器知道,值存储在MEM位置,等于 存储在由索引值添加的数组名称中的地址。 例:

char*arr2=旧缓冲区;将在您的代码中工作,并且您可以将arr2作为数组处理 因为它保存了MEM中预定位数组的第一个元素的地址。 这种编译方式就是rea