PDA

View Full Version : array of pointers



kiarashk
دوشنبه 20 آذر 1391, 20:00 عصر
سلام دوستان
من می خواستم این array of pointers رو یه تستی بکنم (البته توی GCC و زبان C ) اما متاسفانه برنامه با وجود این که هیج errorی نداشت وسطش قطع می شد و خراج می شد کد اینه:


#include <stdio.h>
#define STU_num 2

int main()
{
char *stu[STU_num];


printf("lotfan name daneshjo ra vared konid?\n");
scanf("%s",stu[0]);
printf("%s" , stu[0]);
return 0;
}

کد رو به استاد دادم و استاد توی borland تست کرد و به خوبی جرا شد!

من اومدم خونه و یکم سعی کردم با کد ور برم تا شاید چیزی دست گیرم بشه و اتفاقا هم شد من کد رو به شکل زیر تغییر دادم:


#include <stdio.h>
#define STU_num 2

int main()
{
char str1[3] ;
char str2[3] ;

char *stu[STU_num] = {str1 , str2};

printf("lotfan name daneshjo ra vared konid?\n");
scanf("%s",stu[0]);
printf("%s" , stu[0]);

return 0;
}

و کاملا بدون مشکل روی gcc کار کرد چیزی که من استنباط کردم این بود که رشته ها احتیاج داشتن تا تعیین اندازه بشن اگه درسته خوب چه طوری می شه بدون این که دونه دونه این رشته ها رو درست کنیم براشون با یک دستور کلی اندازه تعیین کنیم؟ و دیگه این که اصلا چرا کد قبلی توی borland جواب داد ولی اینجا نه؟؟

Ananas
دوشنبه 20 آذر 1391, 20:23 عصر
سلام.
آرایه ای از اشاره گرها رو ساختید ولی اشاره گرها هیچ کدوم حافظه ای بهشون داده نشده که به اونجا اشاره کنه. اون کد هم تو برلند احتمالا اتفاقی اجرا شده شایدم اشاره گرها مقدار اولیه ی 0 گرفتن. به هر حال شما یک آرایه ی STU_num عضوی از اشاره گرها دارید که اون اشاره گرها باید هر کدومشون مثلا با new حافظه بگیرن بعد اگه خواستید داخل اون حافظه چیزی بنویسید.

kiarashk
چهارشنبه 22 آذر 1391, 19:04 عصر
سلام.
آرایه ای از اشاره گرها رو ساختید ولی اشاره گرها هیچ کدوم حافظه ای بهشون داده نشده که به اونجا اشاره کنه. اون کد هم تو برلند احتمالا اتفاقی اجرا شده شایدم اشاره گرها مقدار اولیه ی 0 گرفتن. به هر حال شما یک آرایه ی STU_num عضوی از اشاره گرها دارید که اون اشاره گرها باید هر کدومشون مثلا با new حافظه بگیرن بعد اگه خواستید داخل اون حافظه چیزی بنویسید.

خب چه طوری می شه این کار رو کرد ؟

hadi0x7c7
چهارشنبه 22 آذر 1391, 19:20 عصر
خب چه طوری می شه این کار رو کرد ؟
اینجوری:
char *names[20];
char name[20];
scanf("%s", name);
names[0] = strdup(name);
printf("%s\n", names[0]);

kiarashk
چهارشنبه 22 آذر 1391, 21:13 عصر
اینجوری:
char *names[20];
char name[20];
scanf("%s", name);
names[0] = strdup(name);
printf("%s\n", names[0]);

یعنی من اگه بخوام 20 تا رشته داشته باشم باید هر 20 تا رو تعریف کنم؟؟ خب مثلا اگه نمی دونستیم کاربر چند تا رشته رو می خواد وارد کنه چی؟؟

hadi0x7c7
چهارشنبه 22 آذر 1391, 21:31 عصر
فرقی نمیکنه شما شما هر جور بخوای میتونی بنویسی . نکته اینجا تابع strdup هست که یه رشته رو میگیره و با malloc یه فضا واسش اختصاص میده و ادرس اون حافظه رو برمیگردونه;
The rest is up to you!

Ananas
چهارشنبه 22 آذر 1391, 23:07 عصر
می تونید از حلقه استفاده کنید و یک مقداری رو تعیین کنید برای طول همه ی رشته ها مثلا :

#define STU_num 2
#define STR_SIZE 256
char *stu[STU_num];
for (int i = 0; i < STU_num; i++)
{
stu[i] = (char *)malloc(STR_SIZE);
};

و یا اینکه برای هر رشته موقع استفاده حافظه بگیرید و ابتدا اون رو با NULL مقدار اولیه بدید :

#define STU_num 2
char *stu[STU_num];
for (int i = 0; i < STU_num; i++)
{
stu[i] = NULL;
};