PDA

View Full Version : استفاده غيرمجاز از آرايه ها



lohemahfooz
یک شنبه 07 اسفند 1390, 21:15 عصر
سلام دوستان.به برنامه زير دقت كنيد:

#include <iostream>
#include <conio.h>
using namespace std;

int main(){
int a[5];
cin>>a[7];
cout<<a[7];
}


حالا سوالم اينه كه چرا با وجود اين كه ما آرايه را با 5 عضو تعريف كرديم اما ميشه به انديس 7 هم كه اصلا وجود نداره دسترسي پيدا كرد؟
حالا اگه به جاي اون 7 عدد 100 رو بنويسيم اين بار خطاي زمان اجرا به وجود مياد.
اين رو با چند نوع كامپايلر هم امتحان كردم اما همشون اين طور بودن.اگه كسي دليلش رو مي دونه لطفا بگه كه ما هم ياد بگيريم.

pe32_64
دوشنبه 08 اسفند 1390, 16:00 عصر
دلیلش اینه که وقتی شما آرایه با 5 عنصر تعریف می کنی ،کامپایلر کد برای گرفتن همون 5 تا را از سیستم متولید می کنه.
پس وقتی شما از یک عنصر بیشتر از 5 می خوانی یا می نویسی(وقتی شما کد مینویسی کسی برات چک نمی کنه) در واقع کار خلاف کردی ،پس باید مجازات بشی(مجازات نوشتن بیشتر از خوندنه!)

Salar Ashgi
چهارشنبه 10 اسفند 1390, 16:21 عصر
ببینید آرایه یک ساختمان داده ایستاست که مجموعه ای از خانه های متوالی حافظه رو تشکیل میده .
و میشه گفت هر آرایه اشاره گری است به خونه اول آرایه !! و در واقع چون اعضا متوالی هستند براحتی بقیه
اعضای آرایه هم معلوم میشه .
ابتدا به دو کد زیر توجه کنید :


int a[5]={1,2,3,4,5}; for(int i=0;i<5;i++) cout<<a[i]<<endl;



int a[5]={1,2,3,4,5}; for(int i=0;i<5;i++) cout<<*(a+i)<<endl;


اگر هر دو کد رو اجرا کنید ، می بینید که نتیجه یکسانی دارند و خروجی
1
2
3
4
5
را دریافت خواهید کرد . اولی توسط عملگر دسترسی خود آرایه و دومی توسط مفهوم اشاره گری آرایه پیاده سازی شده . این تا اینجا ؛
حال وقتی شما میخواین به یک اندیسی خارج از لیست دسترسی داشته باشید ، عموما نباید پیغام خطایی دریافت کنید ، چونکه کامپایلر
میره مقدار خونه ای که آدرسش گفته شده رو براتون چاپ میکنه ، این کد رو نگاه کنید :



int a[5]={1,2,3,4,5}; cout<<&a[10]<<" "<<a[10];


اندیس 10 تو رنج آرایه مورد نظر نیست ، پس مقدارش هم نباید تو آرایه باشه ، بلکه مقداری است از خونه حافظه با آدرس مورد نظر .
من در خروجی ابتدا آدرس و سپس مقدار خونه از حافظه با این آدرس رو چاپ کرده ام که کاملا موضوع براتون روشن بشه .

http://salarcpp.persiangig.com/new_folder_5/sd89328fu82fj232f.png

موفق باشید ./