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

时间:2013-11-25 20:50:35

标签: c arrays free dimension

我遇到了一些非常奇怪的东西(至少对我而言),而我正在阅读C教程:

void foo(char arr[]){

}


void main(){

  char old_buffer[100];

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


}

带有错误注释的行对我来说很清楚,old_buffer被视为一个地址,所以这不起作用,因为数组缺少应分配多少内存的信息。但是为什么这个功能在头部? 感谢您的支持:)

3 个答案:

答案 0 :(得分:2)

  

带有错误注释的行对我来说很清楚,old_buffer被视为一个地址所以这不起作用,因为数组缺少信息应该分配多少内存。

这很接近,但它并不完全是正在发生的事情:错误的行在语法上是不正确的 - 如果你把它改为

char *arr2 = old_buffer;

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

  

但为什么这是在一个函数的头部工作?

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

void foo(char *arr)

答案 1 :(得分:1)

old_bufferold_buffer[0]的地址,即&old_buffer[0]char arr[]相当于char *arr

答案 2 :(得分:0)

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

A[0] ='v'
A = 0x000000
A[4] = 'c'

//it is location at  0x000000 + 4
//so the
 &A[4] = 0x000004 

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