• 0
yacinebrca

سؤال : التعامل مع خانات خارج حجم المصفوفة

سؤال

..السلام عليكم ....

 

 

 السؤال..

 

 ..أنا وضعت جدول ذات 5 عناصر ....وأضفت في الحلقة التكرارية ( for )   ثلاثة عناصر فستجاب البرنامج وقدم لي 8 عناصر مع اني عرفت هذا الجدول على 5....فكيف تم هذا ..... :excl: :excl: ......

 

 

.

أنطر الى هذا الكود

#include <stdio.h>#include <stdlib.h>#define N 5int main(){            int t[N],i;        for (i=0;i<=N+3;i++)   {         printf("t[%d] = ", i );    scanf("%d",&t[i]);   }      for (i=0;i<=N+3;i++)   {         printf("\nt[%2d] = %d ", i,t[i] );      }     system("PAUSE");	  return 0;}
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

5 إجابة على هذا السؤال .

  • 0

عند تعريف متحول محلّي يتم حجز مكان له في المكدّس الخاص بالبرنامج

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

ولكن هذا سيسبب مشاكل بالنسبة للمتحولات الأخرى ..

فعندما كتبت على مساحة خارج المصفوفة تكون تعديت على مساحة أخرى لا يدري البرنامج أنك استخدمتها , لذلك "قد" يستخدمها أثناء استدعاء التوابع مثلاًَ وبالتالي ستتغير القيم دون معرفتك بذلك

انظر :

t[0] = 1t[1] = 2t[2] = 3t[3] = 4t[4] = 5t[5] = 6t[7] = 7t[8] = 8t[ 0] = 1t[ 1] = 2t[ 2] = 3t[ 3] = 4t[ 4] = 5t[ 5] = 5t[ 6] = 2293544t[ 7] = 7t[ 8] = 8

يمكنك رؤية عنوان كل متحول عن طريق العملية & كما يلي

#include <stdio.h>#include <stdlib.h>#define N 5int main(){    int t[N],i;    for (i=0;i<=N+3;i++)        printf("%d %d\n",&i,&t[i]);  system("PAUSE");  return 0;} 

 

بما أنك عرّفت المصفوفة أول متحول فلم تظهر عندك المشاكل

ولكن جرب كتابة

int i,t[N];

وعندما تسند القيم ضعها كلها أصفار وانظر ماذا سيحدث :)

بالتوفيق

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

int i,t[N];

أخي لقد جربت كما قلت لي وضعت كل القيم أصفار .. ولم أجد مشكل ...

 

ربما لم أفهم كلامك جيدا  ... ممكن تشرح لي أكثر ....

 

 

شكرا لك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

التعامل مع الذاكره فى اللغتين C++/C غير مقيد بحدود مثل الموجوده باللغات الأخرى و هذا يجعل إمكانية الكتابة فى اى مكان بالذاكرة أمر مسموح به من قبل اللغه و على نظام التشغيل أن يتحقق من صلاحية الذاكرة التى تتعامل معها و النتيجه قد تكون بإظهار خطأ إن حاولت الكتابة فى أو القراة من ذاكرة ليست ملكا لك.

 

فى حالتك انت تستخدم الـ stack لحفظ عناصر المصفوفة و الذى يحتوى ايضا على عنواين الذاكره التى سيتم العودة إليها او التى سيتم إستدعائها و كذلك المساحة الخاصة بالدالة التى تستدعيها و متى سيتم حجز هذه المساحة و متى سيتم تحريرها، لذا عندما تقوم بالكتابة فى مدى خارج نطاق المصفوفة الخاصة بك فانت تقوم بتعديل أجزاء من الـ stack قد تكون حيوية و تسبب فى إغلاق برنامجك أو قد تكون مجرد data أخرى. و حيث انك تعمل فى الـ debug mode فسيحتوى الـ stack على معلومات أخرى لا علاقة لها ببرنامجك.

 

إذا اردت ان يعلمك المترجم قم بزيادة درجة التحذير و سيظهر لك رسالة بذلك.

 

للعلم الكتابة فى مكان خارج حدود المصفوفة هو undefined behavior.

 

 

و الله ولي التوفيق

تم تعديل بواسطه C++er
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

انظر ماذا حدث عندي

#include <stdio.h>#include <stdlib.h>#define N 5int main(){            int i,t[N];        for (i=0;i<=N+3;i++)   {        printf("t[%d] = ", i );    scanf("%d",&t[i]);   }      for (i=0;i<=N+3;i++)   {        printf("\nt[%2d] = %d ", i,t[i] );      }     system("PAUSE");      return 0;}

كان هذا هو الخرج

t[0] = 0t[1] = 0t[2] = 0t[3] = 0t[4] = 0t[5] = 0t[6] = 0t[7] = 0t[1] = 0t[2] = 0t[3] = 0t[4] = 0t[5] = 0t[6] = 0t[7] = 0t[1] = 0t[2] = 0t[3] = 0t[4] = 0t[5] = 0t[6] = 0t[7] = 0t[1] = 0t[2] = 0t[3] = 0t[4] = 0t[5] = 0t[6] = 0t[7] =

وهكذا بدون توقف :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

انا جربت الافتكاسه دي قبل كده وانا بعمل برنامج مكتبه علي قدي(تسليه فقط مش احترافي) كده انه يخزن  الكتب وبعد كده يزود  حجمها يعني لما يوصل عدد الكتب لعدد( المصفوفه-1)   يضيف تلقائي مساحه 100 كتاب اخر بكامل بياناتهم من اسم مؤلف وتاريخ و تخصص و كانت النتيجه    تخاريف ظهرت عالشاشه

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .