আমার কোডটি এখানে:
#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);
}
জিসিসি 8.3.0 বা 8.2.1 ব্যতীত যে কোনও অপ্টিমাইজেশন স্তরটি ব্যবহার করে -O0
, 0 2
যখন আমি প্রত্যাশা করছিলাম তখন এই ফলাফলগুলি 2 2
। সংকলক সিদ্ধান্ত নিয়েছে যে সীমারেখা strlen
আবদ্ধ b[0]
এবং তাই কখনও ভাগ করা মানকে সমান বা অতিক্রম করতে পারে না।
এটি কি আমার কোডের একটি বাগ বা সংকলকটিতে কোনও বাগ?
এই মান পরিষ্কারভাবে বানান আউট করা হয় না, কিন্তু আমার মনে হয়েছে পয়েন্টার উত্স মূলধারায় ব্যাখ্যা ছিল যে কোন বস্তুর জন্য X
, কোড (char *)&X
একটি পয়েন্টার যে সমগ্র উপর পুনরুক্তি করতে পারেন উৎপন্ন করা উচিত X
- এই ধারণা রাখা উচিত এমনকি যদি X
আছে ঘটবে অভ্যন্তরীণ কাঠামো হিসাবে সাব-অ্যারে।
(বোনাস প্রশ্ন, এই নির্দিষ্ট অপ্টিমাইজেশন বন্ধ করার জন্য কোনও গিসি পতাকা রয়েছে?)
2 2
বিভিন্ন বিকল্পের অধীনে রিপোর্ট করে ।
s.b
এটি সীমাবদ্ধ b[0]
এটি 8 টি অক্ষরের মধ্যেই সীমাবদ্ধ, এবং তাই দুটি বিকল্প: (1) 8 টি নন-অক্ষর অক্ষর, যা ইউবি, (2) একটি নাল অক্ষর রয়েছে যার মধ্যে লেনটি 8 এর চেয়ে কম, সুতরাং 8 দ্বারা বিভাজন শূন্য দেয়। সুতরাং (1) + (2) সংকলক একসাথে রাখলে উভয় ক্ষেত্রে একই ফলাফল দিতে ইউবি ব্যবহার করতে পারে