这是我的代码:
#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 标志来关闭这个特定的优化?)