تغيير حجم struct بعد الإعلان عنها

السلام عليكم ورحمة الله تعالى وبركته

من فضلكم كيف يمكنني تغيير حجم struct بعد الإعلان عنها.

كيف ؟

مثلا لدي كود يحتوي على هده البنية,

struct mystruct{

int a;

int table[1];

};

مباشرة بعد تنفيد الكود, أي أنني لن أقوم بإعلان أي متغير من تلك البنية, المستخدم سيقوم بإدخال رقم , مثلا 6.

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

struct mystruct{

int a;

int table[6];

};

ثم استعملها بشكل عادي, مثل:

struct mystruct var;

//يعني لن أضطر لإضافة أي أوامر هنا لملائمة الشكل الجديد,أي أن البنية جاهزة للعمل.

for(int i=0;i<6;i++)

var.table[i]=0;

ممكن مساعدة جزاكم الله خيرا

c/c++

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

جرب هذا

هل هو ما تريد؟

لا

الأمر مشابه لإستخدام مؤشر

أنضر ما كتبت

struct mystruct var;

//يعني لن أضطر لإضافة أي أوامر هنا لملائمة الشكل الجديد,أي أن البنية جاهزة للعمل.

for(int i=0;i<6;i++)

var.table[i]=0;

struct mystruct {
    int a;
    int table[];
};

int main(void)
{
    unsigned len;
    printf("Enter table size: ");
    scanf("%u", &len); 
    struct mystruct *var = malloc(sizeof *var + len);
    for(unsigned i=0; i < len; i++) // consider calloc or memset
                var->table[i]=0;
}

 هذه هي الطريقة الصحيحة كما وضحت في منشورك السابق.

إلسي المعياري ليس فيه إمكانية انك تعمل كائن mystruct كما تريده بدون malloc/calloc.

جنو سي فيه طريقتين لتحقيق الموضوع ده بس ده خارج الموضوع.

يمكنك تزويد ال struct بمتغير len يحفظ الحجم لو عندك أكثر من كائن يختلفون في الحجم.

الحل الأخر هو أن تستخدم مؤشر و تعمل له malloc على حده ولكن الطريقة الأولى أريح.

حسنا فهمت

لكن لننسى أمر الجدول

ألا يمكن تغيير حجم STRUCT بعد الإعلان عنها ؟

إلسي المعياري ليس فيه إمكانية انك تعمل كائن mystruct كما تريده بدون malloc/calloc.

أين يتم تخزين STRUCT ؟

ادا كانت تخزن في STACK الا يمكننا التلاعب ب STACK ؟

يمكن عمل مصفوفات متغيرة الحجم (C99 VLA اسمها) ولكن لا يجوز وجودها داخل struct. هذا هء الشيء الوحيد الذي يقترب من التلاعب بال stack. إنظر أيضا الاضافة التي كتبتها بالاسفل

إضافة: يجب أن نراعي أن أي struct في إلسي عند إجراء الكومبيل يأخذ حجما ثابتا (sizeof) وأماكن عناصره تظل ثابتة (offsetof) .

تغير شكل struct يخرق هذين الشرطين.

راعي أيضا إن كل معلومات النوع تختفي بعد الكومبيل. فلا معنى لتغيير شئ يختفي عند الكومبيل بتغير شيء لا نعلمه إلا وقت تشغيل البرنامج.