C解除引用指向数组的指针?

时间:2017-01-17 22:40:13

标签: c arrays pointers

我有一些看起来像这样的代码:

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

为什么会出现分段错误?它不应该打印第一个数组中的第一个值吗?

4 个答案:

答案 0 :(得分:3)

仔细看看,了解声明的性质:

int *array[10];

这将向int声明一个包含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的指针是编译器和/或你的操作系统决定放在那里的。

示例:指向数组的指针

使用指向数组的指针的示例如下所示:

#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

最后三个最终都会导致相同的元素,但以不同的方式进行。

答案 1 :(得分:2)

您遇到分段错误,因为您尝试取消引用未初始化的指针,即 Undefined Behavior

此命令(及以下所有内容):

**ages

取消引用数组(衰减到指针),然后取消引用。你有一个指针数组,而不是指向数组的指针。

答案 2 :(得分:1)

int *array[10];

array是指向int的指针的数组[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

答案 3 :(得分:0)

#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