英文:
diffrent results when trying to find length of an array using pointer arithmetic inside a function and inside of main
问题
有一个奇怪的原因,当我运行这段代码时:
int func(int arr[],int n) {
int a = *(&arr + 1) - arr;
printf("%d",a);
}
我得到一个地址,
当我在主函数内运行相同的代码时,我得到数组的长度。
有什么想法吗?
当我在主函数内运行它时,它给我数组的长度,当我在一个函数内运行它时,它给我一个地址。
英文:
for some odd reason when I run this code:
int func(int arr[],int n) {
int a = *(&arr + 1) - arr;
printf("%d",a);
}
I get an address,
and when I run the same code inside main I get the length of the array.
any idea why?
I ran it inside main and it gave me the length of an array, and when I ran it inside a function it gave me an address.
答案1
得分: 3
这个函数声明
int func(int arr[], int n){
由编译器调整为
int func(int *arr, int n){
另一方面,作为参数表达式传递给函数的数组会被隐式转换为类型为 int *
的第一个元素的指针。
因此,在函数内部,实际上处理的是一个指针而不是一个数组。
在任何情况下,在函数内部使用指针的这一行表达式
int a = *(&arr + 1) - arr;
是无效的并且会引发未定义行为。
英文:
This function declaration
int func(int arr[],int n){
is adjusted by the compiler to
int func(int *arr,int n){
On the other hand. the array passed to the function as an argument expression is implicitly converted to a pointer to its first element of the type int *
.
So within the function you actually deal with a pointer instead of an array.
In any case the expression with pointers used in this line within the function
int a = *(&arr + 1) - arr;
is invalid and invokes undefined behavior.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论