c - GCC 错误、错误代码或 gcc 是好的编译器
问题描述
我有这个代码:
int *b;
b = 50;
printf("Pointer point to address: %p and also point to this value: %d", b, *b);
return 0
我收到此错误:main.c:6:7: 警告:赋值使指针从整数没有强制转换 [-Wint-conversion]
超时:受监控的命令转储核心
sh:第 1 行:47524 分段错误超时 10 秒主
我想从 50 字节的内存中打印值。
我的代码是正确的还是编译器会起作用。
解决方案
假设您在最近的操作系统(如 Linux、Mac 或 Windows)上运行该程序,50 将不是位于物理内存中地址 50 的字节;那是虚拟空间中的地址。
那么您的进程(程序)只能访问该虚拟空间中非常有限的范围,这 50 不太可能来自 ; 在这种情况下,操作系统会保护非法访问并停止您的进程(段错误);无论如何,您甚至可以获得可能是正确的结果,也可能不是正确的结果,这称为未定义的行为,并且在这种情况下,您最好不要依赖明显工作的可执行文件。
例如,要直接访问物理内存,您要么需要构建内核模块,要么从类似 DOS 的操作系统引导。
main.c:6:7:警告:赋值使指针从整数不进行强制转换 [-Wint-conversion]
话虽如此,您需要将其转换50
为 aint *
以清除警告。
b = (int *)50;
推荐阅读
- c++ - 如何使用 fstream 将文本文件存储在堆栈中
- c# - 带有 IdentityType.Guid 的 UserPrincipal.FindByIdentity 不返回任何结果
- python - 主程序中的错误布尔结果(python)
- android - 未找到signingConf.storeFile
- c# - 签名与 S3 不匹配
- ios - 加载xcode项目时问号图标替换图片
- firebase - 类型“CollectionReference”函数云上不存在属性“文档”
- java - 带有重复对象的流 distinct()
- html - input type="number" 在开发模式下接受负值 (-) 但在生产模式下不接受
- java - 如果 Java 8 中存在最小尺寸条件,如何从列表中删除项目?