كما أفهمها ، يعمل الرمز التالي على النحو التالي:
char* cptr = "Hello World";
يعيش "مرحبا العالم" في .rodata
قسم من ذاكرة البرنامج. السلسلة الحرفية "Hello World"
إرجاع مؤشر إلى العنوان الأساسي للسلسلة ، أو عنوان العنصر الأول في ما يسمى "المصفوفة" ، حيث يتم وضع الأحرف بالتسلسل في الذاكرة سيكون "H". هذا هو الرسم التخطيطي الصغير حيث أتخيل السلسلة الحرفية التي يتم تخزينها في الذاكرة:
0x4 : 'H'
0x5 : 'e'
0x6 : 'l'
0x6 : 'l'
0x7 : 'o'
0x8 : ' '
0x9 : 'W'
0xa : 'o'
0xb : 'r'
0xc : 'l'
0xd : 'd'
0xe : '\0'
لذلك يصبح الإعلان أعلاه:
char* cptr = 0x4;
يشير cptr الآن إلى السلسلة الحرفية. أنا فقط اختلق العناوين.
0xa1 : 0x4
الآن كيف يعمل هذا الرمز؟
char cString[] = "Hello World";
أفترض ذلك كما في الحالة السابقة "Hello World"
ينخفض أيضًا إلى عنوان "H" و 0x4.
char cString[] = 0x4;
أنا أقرأ =
كعامل تخصيص زائد الحمل عند استخدامه مع تهيئة صفيف char. كما أفهم ، عند تهيئة السلسلة C فقط ، فإنها تنسخ حرفًا بادئًا بدءًا من العنوان الأساسي المحدد في السلسلة C حتى تصل إلى '\ 0' عند نسخ الحرف الأخير. كما أنها تخصص ذاكرة كافية لجميع الأحرف. نظرًا لأن مشغلي التحميل الزائد هم في الواقع مجرد وظائف ، أفترض أن التنفيذ الداخلي مشابه strcpy()
.
أرغب في تأكيد أحد مبرمجي C الأكثر خبرة على افتراضاتي حول كيفية عمل هذا الرمز. هذا هو تصوري للسلسلة C بعد نسخ الرموز من السلسلة الحرفية فيه:
0xb4 : 'H'
0xb5 : 'e'
0xb6 : 'l'
0xb6 : 'l'
0xb7 : 'o'
0xb8 : ' '
0xb9 : 'W'
0xba : 'o'
0xbb : 'r'
0xbc : 'l'
0xbd : 'd'
0xbe : '\0'
مرة أخرى ، العناوين عشوائية ، والنقطة هي أن السلسلة C في المكدس تختلف عن السلسلة الحرفية في .rodata
قسم في الذاكرة.
ما أحاول القيام به؟ أحاول استخدام مؤشر حرف للاحتفاظ مؤقتًا بالعنوان الأساسي للسلسلة الحرفية ، واستخدام نفس مؤشر الحرف (العنوان الأساسي للسلسلة الحرفية) لتهيئة السلسلة C.
char* cptr = "Hello World";
char cString[] = cptr;
أفترض ذلك "Hello World"
يقيم إلى عنوانه الأساسي ، 0x4
. لذا يجب أن يبدو هذا الرمز كما يلي:
char* cptr = 0x4;
char cString[] = 0x4;
أفترض أنه لا ينبغي أن يكون مختلفًا عن char cString[] = "Hello World";
نظرًا لأن "Hello World" يتم تقييمها إلى عنوانها الأساسي ، وهذا هو ما يتم تخزينه في مؤشر char!
ومع ذلك ، أعطاني مجلس التعاون الخليجي خطأ:
error: invalid initializer
char cString[] = cptr;
^
- كيف لا يمكنك استخدام مؤشر char كعنصر مؤقت مؤقت لتخزين العنوان الأساسي لسلسلة حرفية؟
- كيف يعمل هذا الرمز؟ هل افتراضاتي صحيحة؟
- هل يؤدي استخدام سلسلة حرفية في الرمز إلى إرجاع العنوان الأساسي إلى "المصفوفة" حيث يتم تخزين الأحرف في الذاكرة؟