رمز C بسيط، مع خطأ مزعج "الأنواع غير المتوافقة في المهمة".

StackOverflow https://stackoverflow.com/questions/533724

سؤال

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

المترجم الخاص بي يستمر في إخباري:"خطأ في الأنواع غير المتوافقة في المهمة"

على الخط مع إعادة تخصيص وظيفة

ما الخطأ الذي افعله؟يبدو لي أن كلا من "عكس"، ونتيجة إعادة تخصيص يجب أن تكون مؤشرات لكتابة شار؟

رمز بلدي:

int main(){
char  first[]="hello mark", strng='h', reverse[]="";
char* ptr=&first[10];
int i=0;
    while(ptr > (&strng-0xf4240)){
        printf("%c", *ptr--);
        reverse = realloc(reverse, (i++ * sizeof(char)));
        reverse[strlen(reverse)-i] = *ptr;
    }
printf("%s", reverse);
return 0;
}

شكرًا لك!

يحرر:آسف لقد أخطأت في نشر هذه التعليقات أدناه

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

لقد تحدثت مبكرًا جدًا، لقد تم تجميعها بشكل جيد، ولكن هناك خطأ منطقي.سيتم تنفيذ حلقة while مرة واحدة.ومع ذلك، لا تزال الحلقات اللاحقة تفشل، بغض النظر عن القيمة الأولية لـ i.الخط الذي يسبب الفشل هو الخط الذي يستدعي إعادة التخصيص

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

المحلول

وأنت لا يمكن realloc الذاكرة التي لم malloced في المقام الأول. يجب أن يعلن عكس ذلك بأنه "تشار *" وmalloc أن تبدأ.

وهذا سوف تحصل على الذهاب، ولكن هل حقا أن نفكر في قطع reallocing، بايت بدلا من واحد في وقت واحد. أوه، أنا لم يكلف نفسه عناء إصلاح حقيقة أن "عكس" ربما لا فارغة إنهاء عند محاولة strlen - سأترك ذلك باعتبارها ممارسة للقارئ

int main(){
char  first[]="hello mark", strng='h';
char* reverse;
char* ptr=&first[10];
reverse = (char*)malloc(1);
reverse[0] = '\0';
int i=0;
    while(ptr > (&strng-0xf4240)){
        printf("%c", *ptr--);
        reverse = (char*)realloc(reverse, (i++ * sizeof(char)));
        reverse[strlen(reverse)-i] = *ptr;
    }
printf("%s", reverse);
return 0;
}

نصائح أخرى

أيضاً:

  • تقوم بتجميع رمز C الخاص بك مع برنامج التحويل البرمجي C ++.لهذا السبب يعتقد أنك بحاجة إلى إلقاء الفراغ* الذي تم إرجاعه realloc إلى حرف*.سيكون التحويل قانونيًا في C.

أو

  • لقد فشلت في تضمين stdlib.h, ، هكذا يعتقد المترجم realloc عائدات int

يحرر

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

<اقتباس فقرة>   

وأنت لا يمكن realloc الذاكرة التي لم malloced في المقام الأول.

نعم، بالتأكيد صحيح، لأن من أجل تخصيص، malloc لا بد أن يكون لديهم بعض المعلومات additionnal على قطعة من الذاكرة تقوم بمعالجة (إما من خلال الجدول alocation كتلة، أو تخزينها في 4 بايت فقط قبل المؤشر). ولكن هل يمكن أن لا تزال تكتب:

char * ptr1 = malloc(16);
char * ptr2 = ptr1 + 8;
ptr2 = realloc(ptr2,32);

وسوف لا يكون لديك خطأ المترجم. كنت لا تزال تحصل على الأرجح على segfault في وقت التشغيل، على الرغم من.

ولكن هناك اختلاف جوهري في الطريقة التي يعامل C مترجم

char * tab = "toto";

و

char tab[] = "toto";

في الحالة الأولى، <م> علامة التبويب هو مؤشر من نوع شار * وهو lvalue مثل أي متغير طبيعي. وربما يقيم في سجل أكثر من مرة، أو يمكن أن يكون العنوان على كومة. في الحالة الثانية، علامة التبويب صفيف، ثابت، وبالتالي فهو ليس lvalue. وربما يحل محله في مستوى التجميع عن طريق العنوان الذي يشير إلى القسم نص قابل للتنفيذ ثنائي الخاص بك، حيث تكمن البيانات عن السلسلة "جملة وتفصيلا".

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