c - 为什么分配给直接数组时指针算术会出错
问题描述
我正在尝试使用指针算术的代码,但它似乎给出了错误。
指向*p
arr 的指针使用指针算术提供所需的输出,但是当我对 执行相同操作时*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
,但事实并非如此。可能的原因是什么
解决方案
指针不是数组,您不能使用相同的语法来初始化它们,在第一种情况下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};
推荐阅读
- java - 无法从类型 [java.util.LinkedHashSet ] 转换为类型 [java.util.Set
] - ajax - 我无法使用 ajax 使用 Spring Boot Thymeleaf 端点
- sas - 如何为具有特定条件的变量添加 id-s?
- html - 双斜杠符号//的 HTML 代码是什么?
- php - Nginx 用 PHP 重写 url
- php - php从html标签下载图片并返回下载的图片
- git - 将 Git 从 HTTPS 切换到 SSH,表示权限被拒绝
- python - 第K个最小的快速排序python
- shell - sed 在匹配后插入行仅一次
- node.js - 在一个小节点项目上使用带有preset-env的babel,无法将导入/导出语句转换为commonjs