ما هو النوع الصحيح لاستخدامه لإعلان التخفيف من أنه يمكن أن يتطابق مع المتغيرات أو الأعضاء في الهيكل؟

StackOverflow https://stackoverflow.com/questions/2043787

  •  20-09-2019
  •  | 
  •  

سؤال

ما هو النوع الصحيح لاستخدامه لإعلان التخفيف من أنه يمكن أن يتطابق مع المتغيرات أو الأعضاء في الهيكل؟

تأخذ على سبيل المثال رمز مصدر المثال التالي:

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

struct some_struct {
        int i;
        char *s;
};

void test(void)
{
        struct some_struct *ptr;
        char *s;

        s = malloc(100);
        ptr = malloc(sizeof(struct some_struct));
        ptr->s = malloc(100);

        puts("done");
}

كالآتي التصحيح الدلالي:

@@
identifier ptr;
//idexpression ptr;
//expression ptr;
expression E;
@@

ptr = malloc(E);
+if (ptr == NULL)
+       return;

ال ptr->s مخصص غير متطابق expression ptr يستخدم. ليستخدم expression لهذا يبدو قليلا على نطاق واسع بالنسبة لي. هل هذا صحيح والطريقة الوحيدة للقيام بذلك؟

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

المحلول

بشكل عام، تريد التقاط أي مؤشر LValue - ولكن لأنك تتطابق فقط إلى الأماكن التي يتم فيها تعيين تعبير قيمة منه malloc, ، سيقوم تعبير عادي بهذه المهمة غرامة (نظرا لأن عدم وجود مؤشر أو غير ليفالوي يجب أن يشكو المترجم).

المشكلة التي ستكون لديك هي إذا كان التعبير لديه sideffects، على سبيل المثال:

struct some_struct *a[10];
int i = 0;

a[i++] = malloc(sizeof(struct some_struct));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top