[英]C dereferencing a pointer to array?
我有一些看起来像这样的代码:
int *array[10];
printf("%p\n", array); // Prints an address
printf("%p\n", *array); // Prints a different address
printf("%d\n", **array); // Segmentation Fault 11
printf("%d\n", *array[0]); // Segmentation Fault 11
printf("%d\n", (*array)[0]); // Segmentation Fault 11
为什么会出现细分错误? 它不应该在第一个数组中打印第一个值吗?
要仔细看一下,请了解声明的性质:
int *array[10];
它声明了一个指向int
s的10个指针的数组(当前未初始化)-请注意,这与指向10个int的数组的指针不同,后者将被声明为int (*array)[10]
。 即使以这种方式声明,您仍然需要使用某种东西来初始化指针。
printf("%d\n", array); // Prints an address
这将打印ages数组的地址(将该数组传递给printf会自动将其转换为指针)。
printf("%d\n", *array); // Prints a different address
这使用相同的规则将数组转换为指针,然后取消对该指针的引用。 因此,您要打印数组的第一个值(等效于printf("%d\\n", ages[0])
)。 但是,您实际在此处打印的是地址,而不是整数(即使未初始化)。
printf("%d\n", **array); // Segmentation Fault 11
printf("%d\n", *array[0]); // Segmentation Fault 11
printf("%d\n", (*array)[0]); // Segmentation Fault 11
现在,它们每个都取消引用存储在array[0]
的未初始化指针。 它们确实确实是指向int的,但是指向该int的指针是编译器和/或您的OS决定放置在其中的任何内容。
示例:指向数组的指针
使用指向数组的指针的示例如下所示:
#include <stdio.h>
int main()
{
int array[10] = { 1,2,3,4,5,6,7,8,9,10 };
int (*parr)[10] = &array;
printf("%p\n", parr);
printf("%p\n", *parr);
printf("%d\n", **parr);
printf("%d\n", *parr[0]);
printf("%d\n", (*parr)[0]);
}
输出 (地址明显不同)
0x7fff5fbff990
0x7fff5fbff990
1
1
1
最后三个都最终导致相同的元素,但是以不同的方式进行处理。
由于尝试取消引用未初始化的指针(即Undefined Behavior) ,所以会遇到分段错误。
此命令(及所有以下命令):
**ages
解引用数组(它会衰减为指针),然后您将对其取消引用。 您有一个指针数组,而不是指向数组的指针。
int *array[10];
array
是指向int的指针的array [10](请注意[]
优先级高于*
)。 但是,这10个指针均未初始化为指向有效位置。
鉴于,
printf("%d\n", array); // address of array itself (also address of first element)
printf("%d\n", *array); // getting the value of the fisrt array element - UB/unitilialise (currently points to some random location)
printf("%d\n", **array); // dereference that first pointer - UB/segfault as deferencing an initialised pointer
printf("%d\n", *array[0]); // same as *array
printf("%d\n", (*array)[0]); // same as **array
#include <iostream>
using namespace std;
#include <math.h>
#include <string.h>
int main() {
int arr[5] = {1,2,3,4,5};
int *p=arr;
int intgerSize=sizeof(int);
for(int k=0;k<5;k++)
{
cout<<"arr ["<<k<<"] "<<*(p+(k*sizeof(int)/intgerSize));
cout<<" "<<(p+(k*sizeof(int)/intgerSize));
cout<<" "<<p+k<<"\n";
}`enter code here`
return 0;
}
OUTPUT:-
arr [0] 1 0x7ffd180f5800 0x7ffd180f5800
arr [1] 2 0x7ffd180f5804 0x7ffd180f5804
arr [2] 3 0x7ffd180f5808 0x7ffd180f5808
arr [3] 4 0x7ffd180f580c 0x7ffd180f580c
arr [4] 5 0x7ffd180f5810 0x7ffd180f5810
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.