logo

وظيفة strdup () في C

في هذه المقالة، ستتعرف على وظيفة strdup() في لغة C مع تركيبها ومثالها وتعقيدها ومزاياها وعيوبها.

ال وظيفة ستردوب (). يكرر سلسلة مقدمة في لغة البرمجة C. يقبل سلسلة ذات إنهاء فارغة كحجة. هو - هي النواتج مؤشر إلى سلسلة جديدة مخصصة ديناميكيًا تكون مكررة (على سبيل المثال، an نسخة طبق الأصل ) من سلسلة الإدخال.

ال وظيفة ستردوب (). ليس جزءا من مكتبة C المشتركة . ومع ذلك، يتم تقديمه بشكل متكرر كأحد مكونات الأدوات المساعدة لمعالجة السلسلة على منصات مختلفة. يتم تعريفه على النحو التالي:

بناء الجملة:

لديه بناء الجملة التالي:

 char *strdup(const char *str); 

الدافع ل وظيفة ستردوب (). هو إنشاء نسخة مكررة من سلسلة معينة. انه يأخذ منتهية بقيمة خالية خيط شارع مثل حجتها ويعيد مؤشرًا إلى سلسلة جديدة مخصصة ديناميكيًا وهي نسخة طبق الأصل من السلسلة الأصيلة.

أمر تشاون

وهنا أ انهيار خطوة بخطوة كيف ستردب () يعمل عادة:

  1. تقوم الدالة بحساب طول من الدخول سلسلة سلسلة باستخدام وظيفة سترلين (). . تم الانتهاء منه لتحديد مقدار الذاكرة المطلوبة لتخزين السلسلة المكررة.
  2. ويخصص أ كتلة الذاكرة الجديدة للحفاظ على سلسلة مكررة باستخدام وظيفة مالوك (). . يتم تحديد حجم كتلة الذاكرة من خلال تضمينها 1 في طول سلسلة دخلت . ال اضافية 1 هو ل حرف فارغ ('') الذي ينهي السلسلة.
  3. إذا تخصيص الذاكرة يكون فشل ، ال وظيفة ستردوب (). سيعود أيضًا بشكل صحيح مؤشر فارغ ( مالوك () يفعل نفس الشيء). فحص ستردب () قيمة إرجاع الوظيفة ضرورية للتعامل مع مثل هذه الظروف.
  4. ال الإخراج النهائي للوظيفة هو مؤشر إلى كتلة الذاكرة المخصصة الجديدة التي تحتوي على السلسلة المكررة.

علينا أن نلاحظ المشكلات التالية عند استخدام وظيفة ستردوب (). :

ال وظيفة ستردوب (). يخصص بشكل حيوي ذاكرة لسلسلة الاستنساخ. ولذلك، فإنه مسؤولية المبرمج لتحرير هذه الذاكرة عندما تكون الأميال غير مرغوب فيها الآن في استخدام خاصية فضفاضة (). . قد يؤدي الفشل في تحرير الذاكرة إلى حدوث تسرب للذاكرة.

يعد عادةً اختيارًا جيدًا لتجنب استخدام وظيفة ستردوب (). على سلاسل كبيرة أو في المواقف التي يكون فيها تخصيص الذاكرة هو موضوع . منذ وظيفة ستردوب (). يخصص الذاكرة ديناميكيًا، فقد يفشل دون وجود ذاكرة كافية.

برنامج:

 #include #include #include int main() { const char *original = 'Hello, world!'; char *duplicate = strdup(original); if (duplicate != NULL) { printf('Original string: %s
', original); printf('Duplicate string: %s
', duplicate); free(duplicate); // Release the dynamically allocated memory } else { printf('Memory allocation failed.
'); } return 0; } 

انتاج:

 Original string: Hello, world! Duplicate string: Hello, world! 

توضيح:

قم بتضمين المستندات الرئيسية الأساسية:

    stdio.h يستخدم في عمليات الإدخال / الإخراج . سلسلة.ح يستخدم لوظائف معالجة السلسلة. ستدليب.ح يستخدم في تخصيص الذاكرة الديناميكية سمات.

تحديد المتغيرات:

  • فريد هو مؤشر إلى سلسلة ثابتة 'مرحبا بالعالم!' . هذه السلسلة هي التي نحتاج إلى تكرارها.
  • ال نسخة مطابقة للأصل هو مؤشر لشخص. سيتم حفظ السلسلة المكررة التي تم إنشاؤها باستخدام ستردب () .

استدعاء strdup ():

  • ال وظيفة ستردوب (). يسمى، تمرير السلسلة الأصلية ك دعوى . يخلق أ نسخة مطابقة للأصل ل السلسلة الأصلية ويعيد مؤشرًا إلى السلسلة المكررة. يتم تعيين هذا المؤشر للمتغير المكرر.

تحقق مما إذا كان تخصيص الذاكرة قد أصبح ناجحًا:

  • يقوم البرنامج بفحص ما إذا كانت النسخة المكررة ليست ملفًا مؤشر فارغ . لو وظيفة ستردوب (). كان نجاحًا كبيرًا في تخصيص الذاكرة للسلسلة المكررة، ولن تكون هناك نسخة مكررة الآن باطل .

طباعة السلاسل الأصلية والمكررة:

  • إذا تخصيص الذاكرة يتحول أ يضرب ، يقوم هذا النظام بطباعة أصلي و نسخ سلاسل باستخدام عبارات printf() . ال محدد التنسيق %s يستخدم ل سلاسل الطباعة .

الذاكرة المخصصة ديناميكيًا:

كيفية فرز قائمة الصفيف في جافا
  • بعد طباعة السلاسل، يستدعي هذا النظام مجاني (مكرر) لإطلاق الذاكرة المخصصة ديناميكيا . هذه الخطوة ضرورية لتجنب تسرب الذاكرة.

التعامل مع فشل تخصيص الذاكرة:

  • إذا فشل تخصيص الذاكرة (أي ستردب () وظيفة أسفل الظهر أ مؤشر فارغ )، يقوم البرنامج بطباعة أ رسالة الفشل يشير إلى فشل تخصيص الذاكرة.

العودة من الرئيسي ():

  • البرنامج يعود 0 ، مشيرا التنفيذ الناجح ، لجهاز العمل.

عموما، يوضح هذا التطبيق استخدام وظيفة ستردوب (). لنسخ سلسلة، الاختبارات لتوزيع الذكريات بنجاح، و مطبوعات السلاسل الأصلية والنسخ. كما أنه يتعامل مع الموقف الذي يفشل فيه تخصيص الذاكرة.

تحليل التعقيد:

ال وقت و تعقيد الفضاء التابع ميزة strdup() يمكن تحليلها على النحو التالي:

تعقيد الوقت:

  • ال تعقيد الوقت التابع وظيفة ستردوب (). يمكن اعتبارها خطية أو على) ، بحيث ن هو طول سلسلة الإدخال . إنه بسبب الحقيقة ستردب () يستلزم عمليتين أساسيتين:
  • حساب مدة السلسلة المدخلة:ال ميزة strlen() يستخدم عادةً لتحديد طول سلسلة الإدخال. يتكرر على أحرف السلسلة حتى يواجه فرد فارغ ('') . تستغرق هذه العملية O(ن) تعقيد الوقت ، بحيث ن هي فترة خيط .نسخ السلسلة:ال عملية النسخ يتحقق من خلال وظيفة ستركبي (). أو ال وظيفة memcpy() يأخذ O(ن) تعقيد الوقت كذلك. إنه يستلزم التكرار على كل فرد من السلسلة المدخلة ونسخها إلى كتلة الذاكرة المخصصة حديثًا.
  • لذلك، يمكن تقريب التعقيد الزمني الإجمالي لـ strdup() على النحو التالي: على) ، أين ن هي فترة سلسلة الإدخال .

تعقيد الفضاء:

  • ال تعقيد الفضاء التابع وظيفة ستردوب (). هو أيضا خطي أو على) ، بحيث ن هي مدة سلسلة الإدخال . هذا بسبب ستردب () يخصص الذاكرة ديناميكيًا لسلسلة النسخ، مما يتطلب مساحة إضافية لتخزين الأحرف المنسوخة.
  • يتم تحديد مقدار الذاكرة المخصصة باستخدام مقياس السلسلة المدخلة، ن + 1 ، أين ن هل طول التابع سلسلة الإدخال . اضافية '+1' هو ل فرد فارغ ('') . يتم إلحاقه بـ سلسلة مكررة الإقلاع عن التدخين للتأكد من أنها أميال منتهية بقيمة خالية .
  • ولذلك فإن الإجمالي تعقيد الفضاء من strdup () هو على) ، بحيث ن هي مدة سلسلة الإدخال .

ومن الجدير بالذكر أن في الوقت الحالى وضروريات الفضاء قد تتأثر بالعوامل، إدارة الذاكرة العامة، والتحسينات الخاصة بالجهاز وتفاصيل تنفيذ استخدام مكتبة C. هؤلاء التعقيدات تعمل كمبدأ توجيهي مفضل للتعرف على خصائص الأداء العام لل وظيفة ستردوب (). .

خصائص strdup() في C:

ال وظيفة ستردوب (). في C لديه الخصائص التالية:

تكرار السلسلة: الدافع المهم لل وظيفة ستردوب (). هو إنشاء نسخة مكررة من سلسلة معينة. يقوم بتخصيص الذاكرة للسلسلة المكررة ونسخ محتويات السلسلة الأصلية إلى كتلة الذاكرة المخصصة حديثًا.

إلى طريقة السلسلة Java

تخصيص الذاكرة الديناميكية: ال وظيفة ستردوب (). يخصص الذاكرة ديناميكيًا لـ سلسلة مكررة لاستخدام ال خاصية malloc() . هذه الطريقة هي تخصيص الذاكرة في وقت التشغيل ويمكن إطلاقها باستخدام ميزة مجانية (). بينما ليست هناك حاجة إليها الآن.

الإنهاء الفارغ: ال سلسلة مكررة تم إنشاؤها بواسطة وظيفة ستردوب (). هو كذلك منتهية بقيمة خالية ، يشبه إلى حد كبير سلسلة أصيلة . ال فرد فارغ ('') يتم إلحاقه بالجزء العلوي من سلسلة النسخ لتحديد نهاية السلسلة.

المؤشر المرتجع: ال وظيفة ستردوب (). يقوم بإرجاع مؤشر إلى كتلة الذاكرة المخصصة حديثًا والتي تحتوي على ملف سلسلة مكررة . يشير المؤشر إلى الفرد الأول من السلسلة المكررة.

معالجة الأخطاء: إذا فشل تخصيص الذاكرة، فإن وظيفة ستردوب (). يعود أ مؤشر فارغ للدلالة على الفشل اختبار قيمة الإرجاع لـ وظيفة ستردوب (). يعد التعامل مع مثل هذه السيناريوهات وإنقاذك من الوصول إلى الذاكرة التي لم يتم تخصيصها بنجاح أمرًا بالغ الأهمية.

قابلية التنقل: على الرغم من أن وظيفة ستردوب (). ليس دائمًا جزءًا من مكتبة C المعتادة، فهو عادةً ما يكون متاحًا على العديد من الأنظمة كجزء من الأدوات المساعدة لمعالجة السلسلة. ومع ذلك، قد يختلف مدى توفره اعتمادًا على منصة محددة أو مترجم .

المسؤولية عن إدارة الذاكرة: عند استخدام وظيفة ستردوب (). ، يجب على المبرمج فك الذاكرة المخصصة ديناميكيًا لاستخدام وظيفة مجانية (). بمجرد عدم الرغبة فيه. يمكن أن يؤدي الفشل في تحقيق ذلك إلى تسرب الذاكرة ويمكن أن يؤدي إلى قيام البرنامج بالتهام الذاكرة المفرطة على مر السنين.

التوافق مع وظائف السلسلة القياسية: ال سلسلة مكررة عاد بواسطة وظيفة ستردوب (). يمكن استخدامها مع ميزات سلسلة C العصرية المختلفة، لأنها بعيدة كل البعد عن ذلك سلسلة منتهية بقيمة خالية . انها تسمح ل التكامل النظيف مع الكود الحالي الذي يتعامل مع السلاسل.

فوائد strdup() في C:

هناك العديد من الفوائد لل وظيفة ستردوب (). في C. بعض الفوائد الرئيسية للدالة strdup() هي كما يلي:

الراحة والبساطة: ال وظيفة ستردوب (). يبسط عملية نسخ سلسلة عن طريق دمج تخصيص الذاكرة و نسخ السلسلة الأساليب في استدعاء دالة واحدة. ونتيجة لذلك، تعقيد و مقروئية من الكود كلاهما انخفض ، ويتم إعفاء المطورين من كتابة تعليمات برمجية فريدة لتنفيذ هذه الأنشطة.

سهولة قراءة التعليمات البرمجية وقابلية الصيانة: باستخدام وظيفة ستردوب (). ، يصبح الكود أكثر قابلية للقراءة وشرحًا بذاته. يهدف استدعاء الوظيفة بالفعل إلى تكرار سلسلة، مما يحسن إمكانية قراءة التعليمات البرمجية. كما أنه يقلل من إمكانية ظهور أخطاء مرتبطة بتخصيص الذاكرة الإرشادية ونسخ السلسلة، مما يؤدي إلى كود إضافي قابل للصيانة.

إمكانية إعادة استخدام الكود: ال وظيفة ستردوب (). يسمح بإنشاء إضافات التعليمات البرمجية القابلة لإعادة الاستخدام. من خلال تغليف الحكم الممتاز لتكرار سلسلة مباشرة في ميزة منفصلة، ​​يمكنك إعادة استخدام الوظيفة بسهولة في عناصر متعددة من قاعدة التعليمات البرمجية الخاصة بك. إنه يعزز نمطية التعليمات البرمجية ويقلل من التكرار.

المرونة في تخصيص الذاكرة: منذ وظيفة ستردوب (). يخصص الذاكرة ديناميكيًا للسلسلة المكررة، ويوفر المرونة في إدارة السلاسل ذات الأطوال المختلفة. لا داعي للقلق بشأن حدود أبعاد المخازن المؤقتة ذات الحجم الثابت. إنه مفيد بشكل خاص أثناء إدارة سلاسل الإدخال ذات الأطوال غير المعروفة أو المتغيرة.

تجنب تجاوز سعة المخزن المؤقت: تجاوز سعة المخزن المؤقت تحدث عندما تتجاوز المعلومات مساحة الذاكرة المخصصة، مما قد يؤدي إلى ثغرات أمنية وتعطل التطبيق. باستخدام وظيفة ستردوب (). ، يمكنك تجنب مشاكل تجاوز سعة المخزن المؤقت لأن الوظيفة تقوم بشكل روتيني بتخصيص الذاكرة بناءً على مدة السلسلة المدخلة.

تحسين الذاكرة: في بعض الحالات، باستخدام وظيفة ستردوب (). يمكن أن يؤدي إلى تحسين الذاكرة. على سبيل المثال، عندما تشير متغيرات متعددة إلى محتوى سلسلة متساوٍ، يتم تكرار السلسلة باستخدام ستردب () يمكن أن يقلل من استخدام الذاكرة عن طريق تخصيص ذاكرة منفصلة لكل متغير بدلاً من تكرار محتوى الذاكرة بالكامل.

حدود/عيوب strdup() في C:

ال وظيفة ستردوب (). في لغة C ليس لها حدود محددة تحددها لغة C المنتشرة على نطاق واسع. ومع ذلك، فإن الجهاز الأساسي والأصول المتاحة تحفز سلوكها وحدودها. فيما يلي بعض المشكلات المتعلقة بالحدود أثناء استخدام وظيفة ستردوب (). :

الذاكرة المتاحة: القيد رقم واحد ل وظيفة ستردوب (). هل التوفر التذكير في النظام. منذ وظيفة ستردوب (). يخصص الذاكرة ديناميكيًا لسلسلة النسخ باستخدام مالوك () ، فإن كمية الذاكرة المتاحة للتخصيص يمكن أن تحد من حجم السلسلة التي يمكن تكرارها. إذا كانت هناك ذاكرة غير كافية لتخصيص السلسلة المكررة، فسيتم وظيفة ستردوب (). سوف تفشل والعودة أ مؤشر فارغ .

الحد الأقصى لطول السلسلة: الحد الأقصى لفترة السلسلة التي يمكن تكرارها مع وظيفة ستردوب (). يتم تحديده من خلال حجم كتلة الذاكرة التي يمكن تخصيصها. في الأنظمة القصوى، يكون الحد الأقصى لحجم كتلة الذاكرة المخصصة ديناميكيًا مدفوعًا بعوامل تشمل الذاكرة الفعلية المتوفرة وبنية الجهاز. ال نوع البيانات size_t ، الذي يستخدم لتمثيل مقياس كتل الذاكرة، يمكن أن يفرض حدًا على معظم فترات السلسلة.

الحدود الخاصة بالتنفيذ: ال ميزة strdup() قد يكون لها حدود خاصة بالتنفيذ مفروضة من خلال النظام أو مكتبة C المستخدمة. يمكن أن تختلف هذه الحدود بين أنظمة معينة والمترجمين. من المستحسن الرجوع إلى الوثائق أو الأصول الفريدة للنظام الأساسي لفهم أي حدود معينة مفروضة عن طريق التنفيذ.

اعتبارات أمنية: عند استخدام وظيفة ستردوب (). ، من الضروري أن تكون على دراية بالمخاطر الأمنية المتعلقة بالقدرات، بما في ذلك تجاوز سعة المخزن المؤقت نقاط الضعف. منذ وظيفة ستردوب (). يخصص الذاكرة بناءً على مدة السلسلة المدخلة، وإذا كانت السلسلة المدخلة غير موثوقة أو ذات فترة غير معروفة، فمن الضروري التحقق من صحة المدخلات وتعقيمها لمنع تجاوز سعة المخزن المؤقت أو ثغرات أمنية أخرى.

تعدد الخيوط والتزامن: عند استخدام وظيفة ستردوب (). في بيئة متعددة الخيوط أو متزامنة، من المهم ضمان المزامنة المناسبة وسلامة الخيوط. إذا حاولت عدة سلاسل تكرار السلاسل في وقت واحد، شروط السباق و فساد الذاكرة يمكن أن تنشأ. آليات المزامنة المناسبة ، مثل أقفال أو تخصيص الذاكرة بخيط آمن ، يجب استخدامها للتخفيف من هذه المشاكل.

أنواع الكمبيوتر

تجزئة الذاكرة: الاستخدام المتكرر لل وظيفة ستردوب (). يمكن أن تساهم في تجزئة الذاكرة متأخر , بعد فوات الوقت. تجزئة الذاكرة يحدث عندما تنقسم الذاكرة الحرة إلى صغير , كتل غير متجاورة, مما يجعل من الصعب تخصيص كتل ذاكرة كبيرة . على الرغم من أن الذاكرة المتوفرة كافية، إلا أنها يمكن أن تتسبب بلا شك في حدوث أخطاء في تخصيص الذاكرة. استراتيجيات مثل تجميع الذكريات أو ذكرى مخصصة يمكن للمخصصين المساعدة في تخفيف التجزئة.

وفي الختام، حدود وظيفة ستردوب (). يتم تحديدها غالبًا من خلال الذاكرة المتوفرة على الجهاز، وطول كتل الذاكرة المخصصة ديناميكيًا، وأي لوائح دقيقة للتنفيذ. التعامل مع أخطاء تخصيص الذاكرة والنظر في مخاوف السلامة عند استخدام وظيفة ستردوب (). لنسخ السلاسل أمر بالغ الأهمية.