سؤال

لدي الكود التالي:

char *array1[3] = 
{
    "hello",
    "world",
    "there."
};

struct locator_t
{
    char **t;
    int len;
} locator[2] =
{
    {
        array1,
        10
    }
};

إنه يجمع بشكل جيد مع "gcc -Wall -ansi -pedantic".ولكن مع وجود سلسلة أدوات أخرى (رولي)، فإنه يشكو

warning: initialization from incompatible pointer type

على السطر حيث char **t هو.هل هذا الرمز غير قانوني بالفعل أم أنه موافق؟

شكرا على كل الجواب.أعرف الآن أين كانت مشكلتي.إلا أنه يطرح سؤالاً جديداً:

تهيئة صفيف السلسلة

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

المحلول

يبدو قانونيًا تمامًا بالنسبة لي؛ char *[3] يضمحل ل char **, ، لذا ينبغي أن يكون التعيين صحيحا.

لا يشكو دول مجلس التعاون الخليجي 4.4.5 ولا CLang 1.1.

نصائح أخرى

رغم أنه في الممارسة العملية array1 يجب أن تتحلل إلى مؤشر من النوع char **, ، نوعه الحقيقي هو في الواقع char *[3], ، ومن هنا التحذير.

لقمع التحذير، يمكنك محاولة إرساله بشكل صريح:

...
(char **) array1;
...

array1 هو رمز علامة عام ، والذي يختلف لغويًا عن رمز العلامة العام ، على الرغم من أنه في الواجب يجب أن يتحلل بشكل رشيق إلى رمز ترميز عام

المؤشرات والمصفوفات ومتوافقة فقط في النطاق الثابت.في النطاق العام ، لا يكون المؤشر والمصفوفة متماثلين ، سيؤدي خلط الاثنين إلى سلوك غير محدد.لذا في رأيي التحذير صحيح.

حاول وضع: Genacodicetagpre

في وحدة واحدة و: Genacodicetagpre

في مكان آخر ، ترجمه واربطه.(لم أجربها ...) أتوقع أن تسوء الأمور ...

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