سؤال

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

*array_ref[2] = array[0];
*array_ref[3] = array[1];

ووتحطم على ذلك الجزء في كل مرة.

typedef struct test {
    char *name;
    char *last_name;
} person;



int setName(person ** array, person ***array_ref) {

    *array = malloc (5 * sizeof(person));
    *array_ref= malloc(5 * sizeof(person*));

   array[0]->name = strdup("Bob");
   array[1]->name = strdup("Joseph");
   array[0]->last_name = strdup("Robert");
   array[1]->last_name = strdup("Clark");


*array_ref[2] = array[0];
*array_ref[3] = array[1];


    return 1;
}



int main()
{
    person *array;
    person **array_r;

   setName(&array,&array_r);

    printf("First name is %s %s\n", array[0].name, array[0].last_name);
    printf("Second name is %s %s\n", array_r[3]->name, array_r[3]->last_name);

     while(1) {}
    return 0;
}
هل كانت مفيدة؟

المحلول

ومشغل [] له الأسبقية أعلى من operator* أحادي. وبالتالي، فإن هذا:

*array_ref[2] = array[0];
*array_ref[3] = array[1];

ويعني في الواقع:

*(array_ref[2]) = array[0];
*(array_ref[3]) = array[1];

وأنواع صحيحة هنا، والذي هو السبب في أنه يجمع. ولكن من التعليمات البرمجية من الواضح أن القصد الخاص هو في الواقع:

(*array_ref)[2] = array[0];
(*array_ref)[3] = array[1];

وحتى مجرد استخدام الأقواس.

نصائح أخرى

ويمكنك تخصيص مساحة لمؤشرات array_ref، ولكن ليس على ما يشيرون إليه.

وحاول تغيير التالية في setName ()

 *array_ref[2] = array[0];
 *array_ref[3] = array[1];

إلى

*(*array_ref+2) = array[0];
*(*array_ref+3) = array[1];

وهذا يعمل.

وarray[1]->name هي مشكلتك. يجب (*array)[1].name هذا. لاحظ كيف لا يعادل اثنين. جميع الاستخدامات مماثلة لديها نفس المشكلة، باستثناء [0]، والتي لا قصد الشيء الصحيح.

وتذكر أن array، المعلمة وظيفة، <م> ليس مجموعة الخاصة بك، انها مؤشر إلى مجموعة الخاصة بك.

في وظائف مثل هذا انا افضل كود مثل:

int setName(person ** out_array, person ***out_array_ref) {
    person* array = malloc(5 * sizeof(person));
    person** array_ref = malloc(5 * sizeof(person*));
    array[0].name = strdup("Bob");
    array[1].name = strdup("Joseph");
    array[0].last_name = strdup("Robert");
    array[1].last_name = strdup("Clark");
    // I'm guessing this was your intent for array_ref, here:
    array_ref[2] = &array[0];
    array_ref[3] = &array[1];

    *out_array = out_array;
    *out_array_ref = array_ref;
    return 1;
}

لاحظ أن هذا يمسك كلا array[1]->name كما أشار روجر بات، و*array_ref[2] = array[0] باسم (تقريبا) لاحظ بافل - الذي حل (* array_ref) [2] = مجموعة [0] يعين من person* array[1] غير المخصصة - كلاهما من الصعب أن نلاحظ مع dereference إضافية.

وبطبيعة الحال، أنا في الغالب قيام بذلك لأنني استخدام C ++، وهذا يزيد من السلامة استثناء؛.)

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