الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الـ overflow بالنسبة لمصوفات char

بدأه khaled_prg في 31 أكتوبر 2010 · 7 رد · 731 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

عندما نعلن عن مصفوفة حرفية بإمكانها تخزين 4 حروف :

char str[5];

ثم نطلب من المستخدم إدخال كلمة لنخزنها في المصفوفة :

cin>>str;

فنحن الآن (حسب وجهة نظري) تحت رحمة المستخدم :( فبمجرد أن يُدخل كلمة تحتوي على 5 أحرف (و ما بالك إن زاد !) سيحدث فائض حسابي و لن يكون بإمكان المصفوفة تخزين المُدخلات ! و ربما يتوقف البرنامج عن التنفيذ !, سؤالي هو :

  • كيف يمكننا التحقق من حدوث الـ Overfolw أو إمكانية تخزين المُدخلات في المصفوفة إن صح التعبير, فإذا كان حجم المُدخلات أكبر من حجم المصفوفة سنظهر رسالة للمستخدم تفيد بوقوع الخطأ و إلا فسنظهر له الجملة التي أدخلها.

=========

عندما نُعلن عن مؤشر يشير إلى جملة :

char str = "arabteam2000";

فإنه لا يمكننا تغيير ما يشير إليه المؤشر لأنه مؤشر إلى ثابت و لكنني رأيت البعض يكتبون هكذا:

*str++;

عندما يريدون أن يشير المؤشر إلى الحرف القادم من السلسة !, لكن :

  • مالفرق بين الكتابة السابقة و هذه الكتابة :
    str++;


  • من ناحية أخرى, أليست *str قيمة !؟ ألا يُعتبر الأمر *str++ زيادة للخانة التي يشير إليها المؤشر بواحد !؟

تحياتي.

#2

لتفادي ال buffer overflow استعمل الطريقة التالية

cin.getline(char* buffer, size);

او

cin.getline(char* buffer,sizeof(buffer) );

السؤال 2

النوع الذي نكتبه بين علامتي التنصيص المزدوجتين " " يسمى string litteral وهو من نوع []const char .

هذه الحالة

char* str = "arabteam2000";

str هو مؤشر على const char و بالتالي لا يمكن تغيير قيمة الشيء الذي يؤشر عليه فهذه العملية غير محددة:

*str++;

بينما العملية التالية صحيحة لانها تتم على المؤشر نفسه وليس على القيمة التي يشير اليها .هنا سيتم زيادة عنوان الذاكرة الذي يخزنه المؤشر ب1 و سيصبح المؤشر يشير على العنصر 2 من الجدول اي الحرف 'r'


str++;

imageiz.png

تم تعديل هذه المشاركة بواسطة xpero في 31 أكتوبر 2010 في 20:09

1
#3
اقتباس
لتفادي ال buffer overflow استعمل الطريقة التالية

cin.getline(char* buffer, size);

او

cin.getline(char* buffer,sizeof(buffer)-1 );

يا ريت لو تشرح بمثال عشان تتضح الفكرة :)

اقتباس
str هو مؤشر على const char و بالتالي لا يمكن تغيير قيمة الشيء الذي يؤشر عليه فهذه العملية غير محددة

هذا ما كنت أعتقده و لكن الكود التالي أصابني بالذهول :

#include<iostream>
using namespace std;
int main()
{
    char* str = "arabteam2000";
    *str++;
    cout<<str<<endl;
    system("pause");
    return 0;
}

مخرجات الكود هي :

rabteam2000
#4
khaled_prg كتب:

يا ريت لو تشرح بمثال عشان تتضح الفكرة :)


include <iostream>

using namespace std;

int main()
{
char x[10];
cin.getline(x,sizeof(x));
cout<<x;
return 0;

}


هذا ما كنت أعتقده و لكن الكود التالي أصابني بالذهول :

#include<iostream>
using namespace std;
int main()
{
    char* str = "arabteam2000";
    *str++;
    cout<<str<<endl;
    system("pause");
    return 0;
}

مخرجات الكود هي :

rabteam2000

هنا ما يحدث هو ان العملية تتم على النحو التالي :


*(str++);

لان المعامل ++ له اسبقية في التطبيق على المعامل * .

#5
include <iostream>

using namespace std;

int main()
{
        char x[10];
        cin.getline(x,sizeof(x));
        cout<<x;
        return 0;

}

ليس هذا ما أريده !,فالكود لا يأخذ من المُدخلات ما زاد عن الحجم المحدد, أنا أريد كود يمكن من معرفة ما إذا كان قد حدث overflow و يتصرف بحسب الحالة :)

اقتباس
المعامل ++ له اسبقية في التطبيق على المعامل *

جميل جدا :)

#7
اقتباس
ليس هذا ما أريده !,فالكود لا يأخذ من المُدخلات ما زاد عن الحجم المحدد, أنا أريد كود يمكن من معرفة ما إذا كان قد حدث overflow و يتصرف بحسب الحالة

مجرد فكرة عابرة:

اذا خزنت قيمة العنوان اللذي يلي المصفوفة قبل عملية الادخال وثم قارنتة بعد عملية الادخال

اذا تغير المحتوى فهذا يعني ان المدخلات اخذت حجم اكبر من المحجوز في الذاكرة وهناك buffer overflow

واذا لم يتغير فالعملية سارت بشكل صحيح

ارجو ان الفكرة وصلت

واتمنى المشاركة من الاعضاء والتأكد اذا كانت هذة الطريقة يمكن تطبيقها او لا

#8

^

^

^

سأحاول تطبيق الفكرة وغدا بإذن الله سأطرح مشاركتي

لكن لا اجد تفاعل من الاعضاء ولا صاحب الموضوع

علما ان معلوماتي ضئيلة ولكن بالمحاولة نصل للاحتراف بإذن الله

مواضيع مشابهة