سؤال

أحاول حاليًا تعلم لغة C وواجهت مشكلة لم أتمكن من حلها.

يعتبر:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ELEMENTS 5

void make(char **array, int *array_size) {
    int i;
    char *t = "Hello, World!";

    array = malloc(ELEMENTS * sizeof(char *));

    for (i = 0; i < ELEMENTS; ++i) {
        array[i] = malloc(strlen(t) + 1 * sizeof(char));
        array[i] = strdup(t);
    }
}

int main(int argc, char **argv) {
    char **array;
    int size;
    int i;

    make(array, &size);

    for (i = 0; i < size; ++i) {
        printf("%s\n", array[i]);
    }

    return 0;
}

ليس لدي أي فكرة عن سبب فشل ما ورد أعلاه في إعادة قراءة محتويات المصفوفة بعد إنشائها.لقد أمضيت حرفيًا ساعة محاولًا فهم سبب فشلها ولكني خرجت خالي الوفاض.لا شك أنه شيء تافه.

هتافات،

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

المحلول

وهنا هو رمز العمل:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ELEMENTS 5

void make(char ***array) {
    char *t = "Hello, World!";

    *array = malloc(ELEMENTS * sizeof(char *));

    int i;
    for (i = 0; i < ELEMENTS; ++i) {
        (*array)[i] = strdup(t);
    }
}

int main(int argc, char **argv) {
    char **array;
    make(&array);

    int i;
    for (i = 0; i < ELEMENTS; ++i) {
        printf("%s\n", array[i]);
        free(array[i]);
    }
    free(array);
    return 0;
}

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

نصائح أخرى

وتحتاج إلى تمرير عنوان "مجموعة" في وظيفة. وهذا هو، تحتاج شار ***. هذا هو لأنك بحاجة إلى تغيير قيمة مجموعة، من خلال تخصيص الذاكرة لذلك.

وتحرير: فقط لجعله أكثر اكتمالا، في إعلان وظيفة تحتاج إلى أن يكون شيء من هذا القبيل

void make(char ***array, int *array_size)

وبعد ذلك تحتاج إلى استدعاء باستخدام

make(&array, &size);

داخل الدالة <م> جعل ، وتخصيص الذاكرة مع

*array = malloc(ELEMENTS * sizeof(char *));

وتغيير أماكن أخرى وفقا لذلك.

وبالإضافة إلى ذلك، كما أشار كاوبي بها، strdup ستخصص الذاكرة بالنسبة لك، لذلك أنت لا تحتاج إلى القيام malloc على كل سلسلة.

راجع تعليق PolyThinker الذي هو في محله تمامًا.

بالإضافة إلى طريقة تمرير المصفوفة، يجب عليك التحقق من بعض المشكلات الأخرى:

  1. ربما يجب عليك تعيين شيء ما لـ array_size في make(...)؟
  2. يخصص strdup(char*) الذاكرة، وليس من الضروري استخدام malloc للصفيف[i].
  3. يجب عليك تحرير كل الذاكرة التي خصصتها بعد أن لم تعد بحاجة إليها.

وأنت اجتياز <م> الحالية قيمة مجموعة لجعل كنسخة (على المكدس). عند تغيير مجموعة في جعل ()، كنت فقط تغيير نسخة، وليس المتغير الفعلي. محاولة تمرير بالإشارة مع و، أو جعله شار *** والعمل مع مجموعة * = ...

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

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