首页 > 解决方案 > 为什么分配给直接数组时指针算术会出错

问题描述

我正在尝试使用指针算术的代码,但它似乎给出了错误。

指向*parr 的指针使用指针算术提供所需的输出,但是当我对 执行相同操作时*k,它会给出错误。

#include<stdio.h>

main(){
    int arr[]={1,2,3,4};
    int *p=arr;
    int *k={1,2,3,4};
    printf("%d",*arr+2);
    printf("%d",*k+2);
}

我希望它*k+2给出与 完全相同的输出*arr+2,但事实并非如此。可能的原因是什么

标签: cpointers

解决方案


指针不是数组,您不能使用相同的语法来初始化它们,在第一种情况下p 指向数组第一个元素的地址,而在第二种情况下,您将分配1(列表的第一个值)作为值指向指针,因此k 指向地址0x01,并且由于不允许取消引用此地址,因此会出现错误(可能是分段错误)。

demo.c:7:5: warning: initialization makes pointer from integer without a cast
     int *k={1,2,3,4};
     ^

但是从 C99 开始,我们可以使用复合文字,复合文字允许我们创建具有给定初始化值列表的未命名对象,换句话说:您可以使用对数组的强制转换作为初始化器。

这样:

int *k= (int []){1,2,3,4};

推荐阅读