C 为什么将数组作为参数传递时只有一个自由维度?
在阅读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! } 带有错误注释的行对我来说很清楚,旧的缓冲区被当作地址处理,所以这无法工作,因为数组缺少应该分配多少内存的信息。但是为什么这在函数的
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*arrold\u buffer
是old\u buffer[0]
的地址,也就是说,它是old\u buffer[0]
char arr[]
相当于char*arrold\u buffer
是old\u buffer[0]
的地址,也就是说,它是old\u buffer[0]
char arr[]
相当于char*arrold\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