سؤال

    int length = strlen(src);
    char *structSpace = malloc(sizeof(String) + length + 1);
    String *string = (String*) structSpace;    
    int *string = (int*) structSpace;

* أنا خلق بنية تسمى سلسلة

هل كانت مفيدة؟

المحلول

وأنت لا تفعل ذلك. سوف يلقي void* ضمنا إلى كل ما تحتاجه في C. انظر أيضا C التعليمات على السبب كنت ترغب في تجنب صراحة الصب يوضح عودة malloc في C. @ الجواب سنان المزيد لماذا هذا وقد اتبعت بشكل غير متسق.

نصائح أخرى

ولأن malloc بإرجاع مؤشر بها باطل، أي أنها ببساطة تخصيص قطع من الذاكرة دون أي اعتبار لالبيانات التي سيتم تخزينها هناك. في C ++ الخاص بك وعاد الفراغ * لن يلقي ضمنيا إلى مؤشر من نوع الخاص بك. في المثال الخاص بك، فإنك لم يلقي ما malloc عاد. عاد Malloc فراغا * الذي كان يلقي ضمنيا إلى شار *، ولكن على السطر التالي لك ... حسنا، فإنه لا معنى كبير بعد الآن.

وهذا هو واحد من عدد قليل من القضايا التي تجعل من بيان "C ++ هي مجموعة شاملة من C" ليس صحيحا تماما. في C، مؤشر void يمكن أن يلقي ضمنا إلى أي نوع آخر من المؤشر. ومع ذلك، C ++ هو قليلا أكثر صرامة مع السلامة نوع، لذلك تحتاج للادلاء صراحة قيمة الإرجاع malloc إلى النوع المناسب. عادة، وهذا ليس بكثير من قضية، لأن كود C ++ يميل إلى استخدام new بدلا من malloc، والتي لا تتطلب تلبيس.

في C، صب النتيجة من malloc لا لزوم لها، وينبغي عدم القيام به. ويمكن القيام بذلك، على سبيل المثال، التستر على خطأ بعد أن فشلت في #include <stdlib.h>، لذلك لم يكن لديك نموذج أولي لmalloc في نطاقها. وهذا، بدوره، يمكن أن يؤدي إلى أخطاء أخرى وعدم قابلية (على الرغم من أسوأ المجرمين في هذا الصدد هي الآن في معظمها قديمة).

في C ++، يجب أن يلقي نتيجة malloc لتعيينه إلى مؤشر إلى أي نوع آخر من الفراغ. إلا إذا كنت حقا <م> الحاجة لكتابة التعليمات البرمجية التي يمكن جمعها إما C أو C ++، ومع ذلك، يجب تجنب عادة باستخدام malloc في C ++ على الإطلاق، وتخصيص الذاكرة باستخدام new.

وأنت تميل لرؤية هذا النوع من التعليمات البرمجية C من المبتدئين (أو المبرمجون C ++ :-)):

int main() {
    int len = 40;
    char *my_string = (char *) malloc(sizeof(char)*len);
    return 0;
}

وهذا غير ضروري والشر، ويمكنك تجنب المدلى بها لا طائل منه عبر بما في ذلك stdlib.h

#include <stdlib.h>
int main() {
    int len = 40;
    char *my_string = malloc(sizeof(char)*len);
    return 0;
}

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top