عدد صحيح طويل كما مؤشر مجموعة في ج يعطي خطأ تجزئة

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

  •  19-08-2019
  •  | 
  •  

سؤال

التالية التعليمات البرمجية C يعطي خطأ تجزئة:

#include <stdio.h>
#include <stdint.h>

int main(){
        uint32_t *a;
        uint32_t idx=1233245613;
        a[idx]=1233;
        return 0;
}

كيف يمكنني استخدام uint32_t كما مؤشر مجموعة في C ؟ أو كيف يمكنني استخدام مجموعة مثل هيكل الذي يمكن الحصول على uint32_t و 12 أرقام باعتبارها المؤشر ؟

أقدر لك أي نوع من المساعدة.

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

المحلول

  • المتغير "أ" هو مجرد مؤشر varaible.
  • مؤشر متغير يحمل عنوان موقع الذاكرة.
  • تحتاج إلى النقطة ألف إلى موقع ذاكرة المكان المخصص بالفعل.

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

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

int main(void){

        uint32_t *a;
        uint32_t idx=1233245613;

        //This allows you to index from 0 to 1233245613
        // don't try to index past that number
        a = malloc((idx+1) * sizeof *a);
        if(a == NULL)
        {
           printf("not enough memory");
           return 1;
        }


        a[idx]=1233;
        free(a);
        return 0;
}

نصائح أخرى

إذا كنت ترغب في استخدام "عدد 12 أرقام" حيث أن مؤشر، فإن هذا يعني أنك تريد تحتاج إلى أكثر من 1000000000 البنود. مع كل عنصر كونه uint32_t، فإن هذا يعني أن كل يأخذ أربعة بايت من الذاكرة. لذلك، كنت تبحث في حوالي 4 GB في المجموع الذاكرة لهذه المجموعة. ليست مصنوعة المصفوفات عادة بهذا الحجم، لأداء وأسباب أخرى.

إذا كنت حقا بحاجة كل من هذه البنود مليار، والنظر في خوارزميات المدعومة من القرص، ربما الأحمر الأسود الأشجار ، التي هي مناسبة لتنفيذ هذا النوع من مجموعة عملاقة.

وحسنا بالنسبة للمبتدئين تحتاج إلى تخصيص مساحة ل.

وعند تشغيل هذا الرمز، وهو يشير إلى بعض المساحة في الذاكرة التي ربما كنت لا تملك.
عند محاولة الوصول إليه (في الواقع عند محاولة الوصول إلى + 1233245613) وأنت تسير إلى بعض المساحة في الذاكرة التي بالتأكيد لا تملك، وهذا لا لا ويؤدي إلى تحطم الطائرة.

#include <stdio.h>
#include <stdint.h>

int main(){
        uint32_t *a;
        uint32_t idx=1233245613;
        a = malloc(sizeof(unit32_t) * (idx+1));//+1 cause remember, arrays are 0-based
        if(a == NULL) 
        {
           printf("Array could not be allocated"); 
           return 1;
        }
        a[idx]=1233;
        free(a);//good practice to avoid memory leaks
        return 0;
}

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

تحتاج إلى أمرين:

  • تخصيص الذاكرة a مجموعة, شيء من هذا القبيل uint32_t a[2000000000];
  • ترجمة على 64 بت العمارة التي يمكن أن تعالج أكثر من 4Gb من الذاكرة.

وقف. وهذا ما افسدت.

وOK. مشكلتين هنا. المشكلة الأولى هي أن أعلن مؤشر إلى عدد صحيح، أبدا الإشارة إلى أي شيء، وبعد ذلك حاول لاستخدامه. هذا هو شقة للتو خلل. على الأرجح، فإن المؤشر يحدث للإشارة إلى المكان الذي ليس الذاكرة حتى صالحة للعملية (أو إلى NULL). في هذه الحالة، فإن أي محاولة لاستخدامه سوف أعطيك segfault، تماما مثل الذي حصلت عليه.

والمشكلة الثانية هي القيمة التي تحاول مؤشر من قبل. حتى لو كنت <م> قد الذاكرة المخصصة المؤشر، وأنا أشك هل يمكن أن يكون تخصيص 4.8 غيغابايت لذلك. معظم أجهزة الكمبيوتر لم يكن لديك أي مكان بالقرب من أن الكثير من ذاكرة الوصول العشوائي، وسيرتيانلي ليس لديهم كثيرا في قطعة متجاورة واحد. إذا حاولت مؤشر الماضي الذاكرة التي خصصت لصفيف، الرتق القرب من أي شيء يمكن أن يحدث، ولكن إذا ذهبت <م> الطريق الماضي، وعلى الأرجح ستحصل على segfault.

ووهو مؤشر الذي يشير إلى شيء مفروضا. تريد مجموعة

uint32_t a[42];

والتي تخلق مجموعة من 42 الأعداد الصحيحة. ومع ذلك، فإن وصولك إلى أنه لا يزال يسبب مشاكل (سلوك غير معرف على وجه الدقة) كما هو وسيلة خارج حدود هذا أو أي مجموعة أخرى معقولة.

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