سؤال

هذه هي المرة الأولى التي أقوم فيها بنشر سؤال هنا - لقد بحثت عن تلك المتشابهة ، لكن لم يسبق لي أن وجدت.

ها هو المقتطف من رأسي:

#define LINE_LEN_MAX 256

typedef struct line_description {
    char buffer[LINE_LEN_MAX + 1];
    [...]
} line;

وهنا المقتطف من وظيفتي الرئيسية:

int main(int argc, char *argv[]) {

    line *lineRead;

    //input: valid FILE *, read from cmdline
    //char buffer[LINE_LEN_MAX + 1];

    while(fgets(lineRead->buffer, LINE_LEN_MAX + 1, input) != NULL) {

        [...]

        memset(lineRead->buffer, 0, LINE_LEN_MAX + 1);
    }
}

ما زلت أحصل على segfault. إذا قمت بتعليق خط "memset ()" ، فيمكنني قراءة 3 أسطر بالضبط من ملف الإدخال الخاص بي قبل الحصول على segfault.

ومع ذلك ، إذا استبدلت "Lineread-> Buffer" بشار محلي [] ، فأنا قادر على قراءة ملف الإدخال الخاص بي تمامًا.

ما الذي لا أفهمه عن الهياكل هنا؟ ما أعتقد أنني أريده هو مؤشر لبداية char [] داخل الهيكل ، ولكن من الواضح أن هذا ليس ما يحدث.

تحرير: آسف ، نسيت تحديد: أنا لا أستخدم الذاكرة الديناميكية هنا.

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

المحلول

lineRead في برنامجك هو مؤشر غير ضروري ، وهو ربما ليس ما تريده.

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

نصائح أخرى

ربما تركت شيئًا ما خارج المقتطف الخاص بك ، لكنك لم تظهر الهيكل الذي يتم تخصيصه.

line *lineRead; // uninitialized pointer: access to any field crashes
lineRead = (line*) malloc( sizeof( line_description ) );

أو ، إذا لم تكن بحاجة إلى أن تكون على الكومة (خاصة بالنظر إلى أن كائن المكدس في النطاق الخارجي في main عمر البرنامج بأكمله على أي حال) ،

line lineRead; // don't need to use a pointer!

أنت تعلن lineRead أن تكون مؤشرًا لـ line, ، لكنك لم تقم بالفعل بتعيينه للإشارة إلى أي شيء. عندما تحاول بعد ذلك الوصول إلى الموقع العشوائي الذي يحدثه المؤشر غير المعدل ، ستحصل على خطأ تجزئة.

إذا كنت بحاجة فقط lineRead في النطاق المحلي ، لا ينبغي أن يكون مؤشرًا ، فقط أعلن أنه

line lineRead;

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

line *lineRead = malloc(sizeof(line));
lineRead->buffer[0] = '\0'; // or any other initializations...
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top