سؤال

الرموز التالية اثنين متشابهة ولكن الأول لديه هيكل ، والثاني لا.

لماذا يعمل هذا الرمز (مع عدم وجود تحذيرات)?

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

struct prova
{
    char *stringa;
};

int main()
{
    struct prova p;

    strcpy (p.stringa, "example\0");

    printf("%s\n", p.stringa);

    return 0;
}

لكن الكود التالي لا يعمل?

Segmentation fault (core dumped)

مع هذا التحذير:

code.c: In function ‘main’: code.c:8:9: warning: ‘stringa’ is used uninitialized in this function [-Wuninitialized] strcpy (stringa, "example\0");

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

int main()
{
    char *stringa;

    strcpy (stringa, "example\0");

    printf("%s\n", stringa);

    return 0;
}

شكرا لك!

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

المحلول

لا هو الصحيح لأنك نسخ إلى عنوان محدد من قبل متغير غير مهيأ.لذلك يستدعي كلا البرنامجين سلوكا غير محدد.

حقيقة أن أحد البرامج يعمل هو مجرد فرصة.أحد الأشكال المحتملة للسلوك غير المحدد هو أن برنامجك يعمل بشكل صحيح.

تحتاج إلى تهيئة المؤشر للإشارة إلى كتلة ذاكرة بحجم كاف.على سبيل المثال:

char *stringa = malloc(8);

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

strcpy(stringa, "example");

نصائح أخرى

تحتاج إلى إعطاء سلسلة بعض الذاكرة لذلك نسخ الأحرف إلى.

استخدام malloc

إلى جانب المثال الأول لا تجميع.

عندما تكتب

هيكل بروفا { شار * سترينغا;};

كثافة العمليات الرئيسية() { هيكل بروفا ف;

strcpy (p.stringa, "example\0");

لاحظ أن ص. سترينجا يشير إلى أي مكان على وجه الخصوص ولكنك تنسخه إليه.

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