首页 > 解决方案 > 对二维数组进行别名时 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 22 2strlenb[0]

这是我的代码中的错误还是编译器中的错误?

这在标准中没有明确说明,但我认为指针出处的主流解释是,对于任何 object X,代码(char *)&X都应该生成一个可以迭代整个的指针X——即使X碰巧有这个概念也应该成立子数组作为内部结构。

(额外的问题,是否有一个 gcc 标志来关闭这个特定的优化?)

标签: cmultidimensional-arraycompiler-optimizationstrlengcc8

解决方案



推荐阅读