logo

הפונקציה strdup() ב-C

במאמר זה תלמדו על הפונקציה strdup() ב-C עם התחביר שלה, דוגמה, מורכבות, יתרונות וחסרונות.

ה פונקציית strdup()‎ משכפל מחרוזת שסופקה בשפת התכנות C. הוא מקבל מחרוזת עם א סיום בטל בתור טיעון. זה תפוקות מצביע למחרוזת חדשה שהוקצתה דינמית שהיא כפיל (כלומר, an העתק מדוייק ) של מחרוזת הקלט.

ה פונקציית strdup()‎ אינו חלק מה ספריית C משותפת . עם זאת, הוא מוצע לעתים קרובות כמרכיב של כלי השירות למניפולציה של מחרוזות בפלטפורמות שונות. הוא מוגדר כך:

תחביר:

יש לו את התחביר הבא:

 char *strdup(const char *str); 

המניע של ה פונקציית strdup()‎ הוא ליצור א עותק כפול של מחרוזת נתונה. זה לוקח א בטל חוּט str כפי ש הטיעון שלה ומחזיר מצביע למחרוזת חדשה לגמרי שהוקצתה דינמית שהיא an העתק בפועל של המחרוזת האותנטית.

הצטרפות שמאל לעומת הצטרפות ימנית

הנה פירוט שלב אחר שלב של איך strdup() עובד בדרך כלל:

  1. הפונקציה מחשבת את אורך של הכניסה string str משתמש ב Strlen() פונקציה . זה הושלם כדי להחליט את כמות הזיכרון הדרושה לאחסון המחרוזת הכפולה.
  2. הוא מקצה א בלוק זיכרון חדש לשמור על מחרוזת כפולה משתמש ב malloc() פונקציה . גודל בלוק הזיכרון נקבע על ידי הכללה 1 באורך ה המחרוזת שהוכנסה . ה תוספת 1 הוא עבור תו ריק ('') שמסיים את המחרוזת.
  3. אם ה הקצאת זיכרון הוא נִכשָׁל , ה פונקציית strdup()‎ גם יחזיר בצורה נכונה א מצביע אפס ( malloc() עושה את אותו הדבר). בוחנים את strdup() ערך החזרת הפונקציה חיוני לטיפול בנסיבות כאלה.
  4. ה הפלט הסופי של הפונקציה הוא מצביע לבלוק הזיכרון החדש שהוקצה המכיל את המחרוזת הכפולה.

עלינו לשים לב לבעיות הבאות בעת השימוש ב- פונקציית strdup()‎ :

ה פונקציית strdup()‎ מקצה באופן דינמי זיכרון עבור מחרוזת ההעתקה. לכן, זה ה אחריותו של המתכנת לשחרר את הזיכרון הזה כאשר זה קילומטרים עכשיו לא רצה את השימוש של מאפיין loose(). . אי שחרור הזיכרון עלול לגרום לדליפות זיכרון.

בדרך כלל זו בחירה טובה להימנע משימוש ב פונקציית strdup()‎ על מיתרים גדולים או במצבים שבהם בהקצאת זיכרון תהיה ה נושא . מאז פונקציית strdup()‎ מקצה באופן דינמי זיכרון, הוא יכול להיכשל ללא הזכירה לא מספקת.

תכנית:

 #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() .

התקשר ל-strdup():

אינדקס של ג'אווה
  • ה פונקציית strdup()‎ נקרא, עובר את מחרוזת מקורית בתור טַעֲנָה . זה יוצר א הֶעתֵק מְדוּיָק שֶׁל מחרוזת מקורית ומחזיר מצביע למחרוזת המשוכפלת. מצביע זה מוקצה למשתנה הכפול.

בדוק אם הקצאת זיכרון הופכת ללהיט:

  • התוכנית בוחנת אם כפיל אינו א מצביע אפס . אם פונקציית strdup()‎ היה להיט בהקצאת זיכרונות למחרוזת הכפולה, שכפול לא יהיה כעת ריק .

הדפס מחרוזות מקוריות ושכפולות:

  • אם ה הקצאת זיכרון הופך א מכה , מערכת זו מדפיסה את אוֹתֶנְטִי ו עותקים באמצעות מחרוזות הצהרות printf() . ה מפרט פורמט %s רגיל ל להדפיס מחרוזות .

זיכרון חופשי שהוקצה באופן דינמי:

  • לאחר הדפסת המחרוזות, מערכת זו קוראת חינם (כפול) כדי להפעיל את זיכרון המוקצה באופן דינמי . שלב זה הוא קריטי כדי להרחיק מדליפות זיכרונות.

טיפול בכשל בהקצאת זיכרון:

  • אם הקצאת הזיכרון נכשלה (כלומר, ה strdup() תפקוד גב תחתון א מצביע אפס ), התוכנית מדפיסה א הודעת כשל מה שמציין שהקצאת זיכרון נכשלה.

חזרה מ-main():

  • התכנית מחזיר 0 , מציין ביצוע מוצלח , למכשיר הפועל.

בסך הכל, יישום זה מדגים את השימוש ב- פונקציית strdup()‎ להעתיק מחרוזת, מבחנים להקצאת זיכרונות מוצלחת, ו הדפסים המחרוזות האותנטיות וההעתקות. הוא גם מטפל במצב שבו הקצאת זיכרונות נכשלת.

ניתוח מורכבות:

ה זְמַן ו מורכבות החלל של ה תכונת strdup()‎ ניתן לנתח באופן הבא:

מורכבות זמן:

  • ה מורכבות הזמן של ה פונקציית strdup()‎ עשוי להיחשב ליניארי או עַל) , שבה נ הוא אורך ה מחרוזת קלט . זה נובע מהעובדה strdup() כרוך בשתי פעולות עיקריות:
  • חישוב משך המחרוזת שהוזנה:ה תכונה strlen(). משמש בדרך כלל כדי להחליט על אורך מחרוזת הקלט. זה חוזר על תווים של המחרוזת עד שהוא פוגש את null individual ('') . הפעולה הזו לוקחת O(n) מורכבות זמן , שבה נ היא התקופה של חוּט .העתקת המחרוזת:ה פעולת העתקה הושג באמצעות ה הפונקציה strcpy() או ה הפונקציה memcpy() לוקח O(n) מורכבות זמן באותה מידה. זה כרוך באיטרציה על כל פרט מהמחרוזת שהוכנסה והעתקה לגוש הזיכרונות החדש שהוקצה.
  • לכן, ניתן להעריך את מורכבות הזמן הכוללת של strdup() כ עַל) , איפה נ היא התקופה של מחרוזת קלט .

מורכבות החלל:

  • ה מורכבות החלל של ה פונקציית strdup()‎ הוא גם ליניארי או עַל) , שבה נ הוא משך הזמן של מחרוזת קלט . זה בגלל strdup() מקצה באופן דינמי זיכרון למחרוזת השעתוק, ודורש אזור נוסף לחנות התווים שהועתקו.
  • כמות הזיכרון המוקצה נקבעת באמצעות קנה המידה של המחרוזת שהוזנה, n + 1 , איפה נ האם ה אורך של ה מחרוזת קלט . התוספת '+1' הוא עבור null individual ('') . זה מצורף ל מחרוזת כפולה להפסיק כדי להבטיח שזה קילומטרים בטל .
  • לכן, הכולל מורכבות החלל של strdup() הוא עַל) , שבה נ הוא משך הזמן של מחרוזת קלט .

ראוי לציין כי זמן אמת וצרכי ​​החלל עשויים להיפגע על ידי גורמים, תקורה לניהול זיכרון, אופטימיזציות ספציפיות למכונה , ופרטי היישום של ספריית C שמתרגלים. אלה מורכבויות לתפקד כקו מנחה מועדף לזהות את מאפייני הביצועים הכוללים של פונקציית strdup()‎ .

מאפיינים של strdup() ב-C:

ה פונקציית strdup()‎ ב-C יש את המאפיינים הבאים:

שכפול מחרוזות: המניע החשוב של ה פונקציית strdup()‎ הוא ליצור שכפול של מחרוזת נתונה. הוא מקצה זיכרון למחרוזת הכפולה ומעתיק את תוכן המחרוזת האותנטית לבלוק הזיכרון החדש שהוקצה.

ההבדל בין עץ בינארי לעץ חיפוש בינארי

הקצאת זיכרון דינמית: ה פונקציית strdup()‎ מקצה באופן דינמי זיכרון עבור מחרוזת כפולה להשתמש ב מאפיין malloc(). . שיטה זו שהזיכרון מוקצה בזמן ריצה וניתן להפעיל אותה באמצעות free() תכונה בזמן שאין בו צורך כעת.

סיום בטל: ה מחרוזת כפולה נוצר על ידי ה פונקציית strdup()‎ הוא כמוהו בטל , בדומה ל מחרוזת אותנטית . ה null individual ('') מצורף לחלק העליון של מחרוזת השעתוק כדי לסמן את היציאה מהמחרוזת.

מצביע שהוחזר: ה פונקציית strdup()‎ מחזירה מצביע לגוש הזיכרונות שהוקצה לאחרונה המכיל את מחרוזת כפולה . המצביע מצביע על הפרט הראשון של המחרוזת הכפולה.

טיפול בשגיאות: אם הקצאת הזיכרונות נכשלת, ה פונקציית strdup()‎ מחזיר א מצביע אפס לסמן את הכישלון. בדיקת ערך ההחזר של ה פונקציית strdup()‎ כדי לטפל בתרחישים כאלה ולחסוך ממך גישה לזיכרון שלא הוקצה בהצלחה הוא חיוני.

הִטַלטְלוּת: למרות ש פונקציית strdup()‎ הוא לא תמיד חלק מספריית C הרגילה, הוא זמין בדרך כלל במערכות רבות כחלק מכלי השירות למניפולציה של מחרוזות. עם זאת, הזמינות שלו עשויה להשתנות בהתאם ל פלטפורמה ספציפית אוֹ מַהְדֵר .

אחריות על ניהול זיכרון: בעת שימוש ב פונקציית strdup()‎ , על המתכנת לשחרר את הזיכרון המוקצה באופן דינמי לשימוש ב- free() פונקציה ברגע שזה לא רצוי. כשלון זה עלול להוביל לדליפות זיכרון ועלול לכוון את התוכנית לטרוף זיכרונות מוגזמים לאורך השנים.

תאימות עם פונקציות מחרוזות סטנדרטיות: ה מחרוזת כפולה הוחזר על ידי ה פונקציית strdup()‎ עשוי לשמש עם תכונות שונות אופנתיות של מחרוזת C, שכן היא רחוקה א מחרוזת עם סיומת אפס . זה מכניס פנימה אינטגרציה נקייה עם קוד נוכחי שמתמרן מחרוזות.

היתרונות של strdup() ב-C:

ישנם מספר יתרונות של פונקציית strdup()‎ ב-C. כמה מהיתרונות העיקריים של הפונקציה strdup() הם כדלקמן:

נוחות ופשטות: ה פונקציית strdup()‎ מייעל את תהליך העתקת מחרוזת על ידי מיזוג של הקצאת זיכרון ו העתקת מחרוזת שיטות לתוך קריאת פונקציה אחת. כתוצאה מכך, ה מוּרכָּבוּת ו קְרִיאוּת של הקוד הם שניהם ירד , ומפתחים נחסכים מכתיבת קוד ייחודי לביצוע פעילויות אלו.

קריאת קוד ותחזוקה: משתמש ב פונקציית strdup()‎ , הקוד הופך להיות יותר קריא ומובן מאליו. קריאת הפונקציה אכן מתכוונת לשכפל מחרוזת, ולשפר את קריאות הקוד. זה גם מפחית את האפשרות להציג באגים הקשורים להקצאת זיכרון מדריך והעתקת מחרוזות, וכתוצאה מכך קוד בר תחזוקה נוסף.

שימוש חוזר בקוד: ה פונקציית strdup()‎ מאפשר יצירת תוספי קוד הניתנים לשימוש חוזר. על ידי הקפלת שיקול הדעת המצוין לשכפול מחרוזת ישר לתוך תכונה נפרדת, אתה יכול לעשות שימוש חוזר בפונקציה ללא מאמץ במספר אלמנטים של בסיס הקוד שלך. זה מקדם מודולריות של קוד ומפחית יתירות.

גמישות עם הקצאת זיכרון: מאז פונקציית strdup()‎ מקצה באופן דינמי זיכרון למחרוזת הכפולה, הוא מעניק גמישות בניהול מחרוזות באורכים שונים. אינך צריך לדאוג לגבי גבולות הממדים של מאגרים בגודל קבוע. זה שימושי במיוחד בעת ניהול מחרוזות קלט באורכים לא ידועים או משתנים.

הימנעות מהצפת מאגר: המאגר עולה על גדותיו להתרחש כאשר המידע חורג משטח הזיכרונות המוקצה, מה שעלול לגרום לפרצות אבטחה ולקריסות יישומים. משתמש ב פונקציית strdup()‎ , אתה עשוי להימנע מבעיות של הצפת מאגר מכיוון שהפונקציה מקצה באופן שגרתי זיכרון בהתבסס על משך המחרוזת שהוזנה.

עקיפת שיטת java

אופטימיזציה של זיכרון: במקרים מסוימים, שימוש ב- פונקציית strdup()‎ יכול לגרום לאופטימיזציה של הזיכרון. לדוגמה, כאשר משתנים מרובים מצביעים על תוכן מחרוזת שווה, שכפול המחרוזת עם strdup() יכול להפחית את ניצול הזיכרון על ידי הקצאת זיכרון נפרד לכל משתנה במקום שכפול של כל תוכן הזיכרון.

גבולות/חסרונות של strdup() ב-C:

ה פונקציית strdup()‎ ב-C אין מגבלות ספציפיות המוגדרות על ידי שפת C הנפוצה. עם זאת, המכשיר הבסיסי והנכסים הזמינים מניעים את התנהגותו ומגבלותיו. להלן כמה סוגיות הנוגעות למגבלות בזמן השימוש ב- פונקציית strdup()‎ :

זיכרון זמין: ההגבלה מספר אחת עבור פונקציית strdup()‎ האם ה זמינות של זיכרונות במערכת. מאז פונקציית strdup()‎ מקצה באופן דינמי זיכרונות עבור מחרוזת השעתוק באמצעות malloc() , כמות הזיכרונות הזמינה להקצאה יכולה להגביל את קנה המידה של המחרוזת שעלולה להיות משוכפלת. אם יש זיכרון לא מספק להקצאת המחרוזת הכפולה, ה פונקציית strdup()‎ ייכשל ויחזיר א מצביע אפס .

אורך מיתר מקסימלי: התקופה המקסימלית של מחרוזת שניתן לשכפל עם פונקציית strdup()‎ נקבע באמצעות קנה המידה של בלוק ההזכרות שניתן להקצות. במערכות מקסימליות, הגודל המרבי של בלוק זיכרונות המוקצה באופן דינמי מונע על ידי גורמים הכוללים הזיכרון הפיזי הזמין ומבנה המכונה. ה size_t סוג נתונים , המשמש לייצוג קנה המידה של בלוקי הזכרון, יכול להטיל הגבלה על התקופה המהירה ביותר.

מגבלות ספציפיות ליישום: ה תכונת strdup()‎ ייתכן שיוטלו מגבלות ספציפיות ליישום באמצעות המערכת או ספריית ה-C שבה נעשה שימוש. מגבלות אלו יכולות להשתנות בין מערכות ספציפיות ומהדרים. מומלץ לעיין בתיעוד או בנכסים הייחודיים לפלטפורמה כדי לתפוס מגבלות מסוימות שהוטלו בדרך של היישום.

שיקולי אבטחה: בעת שימוש ב פונקציית strdup()‎ , חיוני להיות מודע לסיכוני אבטחת יכולת, כולל הצפת חיץ פגיעויות. מאז פונקציית strdup()‎ מקצה זיכרונות בהתבסס על משך המחרוזת שהוזנה, אם המחרוזת שהוזנה אינה מהימנה או מתקופה לא ידועה, חיוני לאמת ולחטא את הקלט כדי למנוע הצפת מאגר או פרצות בטיחות שונות.

ריבוי השרשורים ובמקבילות: בעת שימוש ב פונקציית strdup()‎ בסביבה מרובה הליכי או בו-זמנית, חשוב להבטיח סנכרון נאות ובטיחות פתיל. אם מספר חוטים מנסים לשכפל מחרוזות בו זמנית, תנאי המירוץ ו פגיעה בזיכרון יכול להתעורר. מנגנוני סנכרון תקינים , כמו מנעולים אוֹ הקצאת זיכרון מאובטחת בחוט , יש להשתמש בהם כדי למתן את הצרות הללו.

פיצול זיכרון: ניצול תכוף של פונקציית strdup()‎ יכול לתרום פיצול זיכרון שעות נוספות. פיצול זיכרון קורה כאשר זיכרון לא מהודק מתחלק ל קָטָן , בלוקים לא רציפים, מה שהופך את זה למאתגר להקצות בלוקי זיכרון גדולים . למרות שהזיכרון הזמין מספיק, אין ספק שהוא יכול לגרום לבריגים בהקצאת זיכרונות. אסטרטגיות כמו איגום זכרונות אוֹ זכרון מותאם אישית מקצים יכולים לסייע בהפחתת פיצול.

לסיכום, גבולות ה פונקציית strdup()‎ נקבעים לעתים קרובות באמצעות הזיכרון הקיים בגאדג'ט, אורך בלוקי הזיכרון המוקצים באופן דינמי וכל תקנות יישום מדויקות. התמודדות עם תקלות בהקצאת זיכרון ובחינת חששות בטיחות בעת השימוש ב- פונקציית strdup()‎ להעתיק מחרוזות זה קריטי.