通过一些C面试问题,我找到了一个问题,指出“如何在不使用sizeof运算符的情况下在C中查找数组的大小?”,并提供以下解决方案。它有效,但是我不明白为什么。
#include <stdio.h>
int main() {
int a[] = {100, 200, 300, 400, 500};
int size = 0;
size = *(&a + 1) - a;
printf("%d\n", size);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如预期的那样,它返回5。
编辑:人们指出了这个答案,但是语法确实有所不同,即索引方法
size = (&arr)[1] - arr;
Run Code Online (Sandbox Code Playgroud)
因此,我认为这两个问题都是有效的,并且对该问题的解决方法略有不同。谢谢大家的大力帮助和详尽的解释!
假设我想获取大小未知的自动数组的最后一个元素.我知道我可以利用sizeof运算符来获取数组的大小并相应地获取最后一个元素.
使用*((*(&array + 1)) - 1)安全吗?
喜欢:
char array[SOME_SIZE] = { ... };
printf("Last element = %c", *((*(&array + 1)) - 1));
Run Code Online (Sandbox Code Playgroud)
int array[SOME_SIZE] = { ... };
printf("Last element = %d", *((*(&array + 1)) - 1));
Run Code Online (Sandbox Code Playgroud)
等等
int arr[10]={1,2,3,4,5,6,7,8,9,10};
printf("%p,%p\n", arr, &arr);
printf("%p,%p\n", arr+1, &arr+1);
return 0;
Run Code Online (Sandbox Code Playgroud)
对于此代码,GCC编译器返回
0xbfe41348,0xbfe41348
0xbfe4134c,0xbfe41370
Run Code Online (Sandbox Code Playgroud)
第一行很清楚,没问题.但第二行让我感到困惑.第一个地址移动到下一个int,所以它是4个字节后arr,清除.但是,因为&arr+1我认为它将指向整个数组的末尾arr[10],所以它应该向地址添加4*10.我误解了什么吗?
在查找数组的大小而不使用C中的sizeof的问题中,提问者通过获取地址然后指定数组索引1来处理类似于int数组的int数组:
int arr[100];
printf ("%d\n", (&arr)[1] - arr);
Run Code Online (Sandbox Code Playgroud)
该值最终成为之后100个元素的"下一个"数组中第一个元素的地址arr.当我尝试这个类似的代码时,似乎没有做同样的事情:
int *y = NULL;
printf("y = %d\n", y);
printf("(&y)[0] = %d\n", (&y)[0]);
printf("(&y)[1] = %d\n", (&y)[1]);
Run Code Online (Sandbox Code Playgroud)
我最终得到:
y = 1552652636
(&y)[0] = 1552652636
(&y)[1] = 0
Run Code Online (Sandbox Code Playgroud)
为什么不是(&y)[1]指向int的"next"指针的地址y?
我需要找到数组的长度,如何在不使用该sizeof函数的情况下执行此操作.
例如,如果
Array 1 = [0 1 2 3 4 5 6]
Run Code Online (Sandbox Code Playgroud)
这个数组的大小是7.