İşte benim kod:
#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 veya 8.2.1'i dışında herhangi bir optimizasyon seviyesi ile kullanmak , beklediğim zaman -O0
çıktı 0 2
verir 2 2
. Derleyici strlen
, b[0]
bunun bölündüğü değere bağlı olduğuna ve bu nedenle asla eşitlenemeyeceğine veya bu değeri aşmayacağına karar verdi .
Bu benim kodumda bir hata mı yoksa derleyicide bir hata mı?
Bu standartta açıkça belirtilmemiştir, ancak işaretçi provenansının ana akım yorumunun, herhangi bir nesne için X
, kodun (char *)&X
tamamı üzerinde tekrarlayabilen bir işaretçi oluşturması gerektiğini düşündüm X
- bu kavram X
, iç yapı olarak alt diziler.
(Bonus soru, bu özel optimizasyonu kapatmak için bir gcc bayrağı var mı?)
2 2
çeşitli seçenekler altında.
s.b
sınırlıdır b[0]
bunun 8 karakterden ve dolayısıyla iki seçenek ile sınırlıdır: (1) UB 8 boş olmayan karakterler vardır out-of-ciltli durumda erişimi, (2) bir null karakteri olan, orada len 8'den küçüktür, bu nedenle 8'e bölmek sıfır verir. Bu yüzden (1) + (2) derleyici her iki durumda da aynı sonucu vermek için