c - 对二维数组进行别名时 strlen 的意外优化
问题描述
这是我的代码:
#include <string.h>
#include <stdio.h>
typedef char BUF[8];
typedef struct
{
BUF b[23];
} S;
S s;
int main()
{
int n;
memcpy(&s, "1234567812345678", 17);
n = strlen((char *)&s.b) / sizeof(BUF);
printf("%d\n", n);
n = strlen((char *)&s) / sizeof(BUF);
printf("%d\n", n);
}
使用 gcc 8.3.0 或 8.2.1 与任何优化级别,除了我期待的-O0
输出。编译器决定是有界的,因此永远不能等于或超过被除的值。0 2
2 2
strlen
b[0]
这是我的代码中的错误还是编译器中的错误?
这在标准中没有明确说明,但我认为指针出处的主流解释是,对于任何 object X
,代码(char *)&X
都应该生成一个可以迭代整个的指针X
——即使X
碰巧有这个概念也应该成立子数组作为内部结构。
(额外的问题,是否有一个 gcc 标志来关闭这个特定的优化?)
解决方案
推荐阅读
- postman - 对 Postman 监视器请求的测试数据
- flutter - Flutter项目的Ios构建失败
- java - 创建类路径资源中定义的名称为“dataSource”的 bean 时出错
- angular - 角 - npm 安装
- javascript - React - 如何使嵌入式多步谷歌表单(iframe)仅在单击“下一步”或“提交”按钮时滚动到顶部
- php - 如何在 Laravel 中缓存 BLOB 类型
- javascript - 如何在我的轮播部分实现 i18next 功能?
- c# - 如何使用反射从方法中获取方法的参数值?
- python - 编译守望者因“无效语法”而失败
- windows - 我连接了多台显示器,当任何连接的显示器电源关闭时,使用 windows 消息通过弹出消息通知。(WindowProc)