برگزیده های پرشین تولز

مشكله من و اشاره گر و رشته

sasan_66

کاربر تازه وارد
تاریخ عضویت
18 جولای 2006
نوشته‌ها
450
لایک‌ها
0
سلام
كد زير رو در نظر بگيرين:
کد:
char *s = "sasan";
حالا اگه بخوام كاراكتر دوم s رو از a به b اينجوري
کد:
 *(s +1 ) = 'b';
تغيير بدم چرا برنامه موقع اجرا ارور ميده؟
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
کد:
	char *ptr = "test",*p;
   p = ptr+1 ;
   *p = 'a' ;
   cout << ptr ;
 

sasan_66

کاربر تازه وارد
تاریخ عضویت
18 جولای 2006
نوشته‌ها
450
لایک‌ها
0
سلام
با تشكر از جوابتون آقا مهدي ولي من راه حل نخواستم من فقط ميخوام بدونم چرا
کد:
*(s +1 ) = 'b';
اين كد باعث ارور ميشه
 

sasan_66

کاربر تازه وارد
تاریخ عضویت
18 جولای 2006
نوشته‌ها
450
لایک‌ها
0
راستي كدي رو هم كه شما نوشتين بازم در زمان اجرا ارور ميده
 

sasan_66

کاربر تازه وارد
تاریخ عضویت
18 جولای 2006
نوشته‌ها
450
لایک‌ها
0
راستي اين كد در visual c++ ارور ميده من تو tubo c++ تست كردم موردي نداشت
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
کد مشکلی نداره
-----
اما در رابطه با اینکه چرا؟
چون : شما در expression ها یک مقدار سمت چپ نیاز دارید lvalue نه یک مقداری اعلانی (واژه اعلان من در آورده هست) منظور : *(s +1 )
 

sasan_66

کاربر تازه وارد
تاریخ عضویت
18 جولای 2006
نوشته‌ها
450
لایک‌ها
0
اما در رابطه با اینکه چرا؟
چون : شما در expression ها یک مقدار سمت چپ نیاز دارید lvalue نه یک مقداری اعلانی (واژه اعلان من در آورده هست) منظور : *(s +1 )
ايني كه شما گفتيد يه خطاي كامپايلريه من عرض كردم برنامم كامپايل ميشه و تا جايي كه هنوز به اين كد نرسيده اجرا ميشه و به محض رسيدن به اين خط ارور ميده و اين كد نيمدونم چرا تو ويژوال سي پلاس پلاس ارور ميده .من تو توربو سي پلاس پلاس تست كردم اصلا ارور نميده
منظور شما از مقدار اعلانی rvalue هستش؟ اگه اينطوريه
کد:
*(s +1 )
كجاي اين كد rvalue است؟ تا اونجا كه من ميدونم يه lvalue تمام عياره :happy: و به راحتي هم ميتونه سمت چپ expression قرار بگيره
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
برای این ایراد می گیره که وقتی شما یه رشته رو به کمک اشاره گر تعریف می کنید مثلا
کد:
char *s="C++";
برای این رشته حافظه گرفته نمی شه و اشاره گر به رشته اصلی توی فایل اجرایی برنامه اشاره می کنه و اونجا هم فقط خوندنی هست
پس باید برای رشته ای که قراره تغییر کنه حافظه بگیرید که می تونید با تعریف کردن به صورت ارایه مشکل رو حل کنید
کد:
char s1[]="C++";
 

sasan_66

کاربر تازه وارد
تاریخ عضویت
18 جولای 2006
نوشته‌ها
450
لایک‌ها
0
چرا اين مشكل تو توربو سي پلاس پلاس وجود نداره؟
 

apache**

کاربر تازه وارد
تاریخ عضویت
15 جولای 2006
نوشته‌ها
26
لایک‌ها
0
محل سکونت
Tehran
البته منم معتقدم این اشکال مال کامپایلرهای مزخرف ویندوزیه ولی اینجوریم میشه با یه پوینتر جا اشغال کرد:
char *s;
s = (char *) malloc (strlen("C++"));
strcpy(s, "C++") ;

البته قبول دارم که واقعاً راههای راحتتری هم هست!!:lol: :f34r:
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
به نقل از sasan_66 :
اونجا كه من ميدونم يه lvalue تمام عياره :happy: و به راحتي هم ميتونه سمت چپ expression قرار بگيره

این رو باید به کامپایلر گفت :)
چون من خطای اونو تشریح کردم
 

sasan_66

کاربر تازه وارد
تاریخ عضویت
18 جولای 2006
نوشته‌ها
450
لایک‌ها
0
چرا با اجراي اين دستور فضايي براي s در نظر گرفته نميشه؟
کد:
char *s="C++";
چون من يه جايي خونم وقتي يه پوينتر از نوع كاراكتر رو با يه رشته ( در اين مثال c++) مقدار دهي اوليه ميكنيم فضا اختصاص داده ميشه
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
چون شما از کامپایلر نخواستین اگه فضا در نظر بگیره باید ببینید ایراد از کجاست ولی شما فقط دارید یه انتصاب ساده انجام می دید حتما می نوید که رشته های داخل دابل کوتیشت یه جور آشاره گر ثابت به کارکتر ها هستن پس شما فقط مقدار یه آشاره گر رو ست می کنید
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
خود s هم فظا ميگيره (اما نه براي رشته)
4 بايت ، براي آدرس دهي حافظه 32 بيتي
 
بالا