سؤال

ولدي مشكلة مع التعليمات البرمجية التالية:

for(i = 0;(i - 1)< n;i++)
{
char* b;
sprintf(b, "%d", i);
}

ويجمع بشكل جيد ولكن عند تشغيل انها تعطيني الشائنة خطأ "0XC0000005 انتهاك وصول". لقد حاول b الإعداد لNULL، ""، "0"، 0 وحفنة من الأشياء الأخرى ولكن بعد ذلك الحصول على "" خطأ أو "0XC0000005 انتهاك وصول التعبير:!.! سلسلة = NULL أي مساعدة سيكون موضع تقدير

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

المحلول

وsprintf يكتب البيانات إلى وجود مخزن مؤقت الحالية، والتي تنتقل إلى أنها المعلمة الأولى. حاليا أنت لا تحدد قيمة لب على الإطلاق، وهو ما يعني (IIRC في C) يمكن أن تكون قيمة أي شيء. إذا قمت بتعيين أنه إلى NULL أو 0، sprintf سوف تحاول أن تكتب في الذاكرة ابتداء من العنوان 0.

وتحتاج إلى إنشاء منطقة عازلة من الحجم المناسب، بحيث sprintf يمكن الكتابة فيه. على سبيل المثال:

for(i = 0;(i - 1)< n;i++)
{
    char b[10];
    sprintf(b, "%d", i);
}

وإذا كان هذا هو في الواقع كيف تريد تخصيص المخزن المؤقت يعتمد على ما يريد كود الخاص بك الحقيقي يجب القيام به مع النتائج، بطبيعة الحال.

نصائح أخرى

وأم ... المؤشر إلى ب يحتوي القمامة وبما انك لم تهيئة أو تخصيص مساحة. Springtf يتطلب منك خصصت مساحة المخزن المؤقت الوجهة ...

وكحد أدنى، كنت تريد شيئا مثل شار ب [50] أو أيا كان القصوى الحجم الذي نتوقع، وليس مجرد شار *.

وA شار * هو مؤشر غير مهيأ لشار أو شار مجموعة. تحتاج إلى تعريف شار عازلة [10]، وإلا فإن عنوان الهدف من sprintf غير معرف.

وsprintf يتطلب لتمرير ذلك وجود مخزن مؤقت شخصية خصصت بالفعل كبيرة بما يكفي لتخزين أي نتيجة ممكنة. وهذا يخضع للغاية لعازلة الفيضانات - ربما كنت ترغب في استخدام snprintf أكثر أمنا بدلا من ذلك. طريقة واحدة غير فعالة ولكن آمنة للقيام بذلك:

int bufsize = snprintf(NULL, 0, formatstring, ...);
char *buffer = malloc(bufsize+1); # count doesn't include trailing nul
if (buffer == NULL) out_of_memory_error();
snprintf(buffer, bufsize+1, formatstring, ...);

وشكرا جزيلا لك! منذ أن كنت في حاجة إلى شار * I أعاد كتابة رمز إلى:

for(i = 0;(i - 1)< n;i++)
{
char* b;
char a[100];
b = a;
sprintf(b, "%d", i);
}

ووأنه يعمل مثل السحر. أنا يمكن أن تحصل في النهاية الآن في حياتي! مرة أخرى أشكركم جدا جدا!

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