我遇到了一些非常奇怪的东西(至少对我而言),而我正在阅读C教程:
void foo(char arr[]){
}
void main(){
char old_buffer[100];
foo(old_buffer); //Working??!
char arr2[] = old_buffer; //Error!
}
带有错误注释的行对我来说很清楚,old_buffer被视为一个地址,所以这不起作用,因为数组缺少应分配多少内存的信息。但是为什么这个功能在头部? 感谢您的支持:)
答案 0 :(得分:2)
带有错误注释的行对我来说很清楚,old_buffer被视为一个地址所以这不起作用,因为数组缺少信息应该分配多少内存。
这很接近,但它并不完全是正在发生的事情:错误的行在语法上是不正确的 - 如果你把它改为
char *arr2 = old_buffer;
它会起作用。但是,这不是一个数组,它将是一个指针。它允许类似于数组的访问,但它不会在sizeof
中为您提供正确的值。
但为什么这是在一个函数的头部工作?
因为当您将数组传递给函数时,始终会忽略该大小。据说数组衰减指针。换句话说,您的声明与此相同:
void foo(char *arr)
答案 1 :(得分:1)
old_buffer
是old_buffer[0]
的地址,即&old_buffer[0]
。 char arr[]
相当于char *arr
。
答案 2 :(得分:0)
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中保存了预先定位数组的第一个元素的地址。 这种编译方式是使代码在函数头部工作的原因。