تعریف lenght یک ارایه global بعد از تابع main
سلام خدمت دوستان.
من در زبان c یک ارایه دوبعدی از نوع char دارم که به صورت زیر تعریف کردم.
char myarray[1000][18];
بعد دوم ارایه همیشه شامل 18 المنت هست.
اما بعد اول ماکزیمم المنتش 1000 تا هست.
در صورتی که گاهی اوقات فقط در حد 2 یا 3 المنت (از بعد اول) نیاز هست . و تعریف 1000 المنت واسش فقط حافظه رو پر میکنه (+ توی اسکن کردن ارابه هم به شدت زمان تلف میکنه.)
فرض کنید من تعداد المنتی که نیاز دارم را در متغیری به نام k ذخیره کردم. حالا میشه به صورت char myarray[k][18] ارایه را تعریف کرد.
اما مشکلی که هست اینه که متغیر k تو تابع main مقدار دهی میشه.
از طرفی ارایه ی من global هست و نمیتونم توی main تعریفش کنم.
+ امکان استفاده از پوینتر ها را هم ندارم.
ممنون میشم راهنمایی کنید.
نقل قول: تعریف lenght یک ارایه global بعد از تابع main
تا جایی که من میدونم این کار شدنی نیست
آرایه یا ابعادش ثابته که میتونی همونطور که خودتون نوشتین، تعریفش کنین البته این روش هم یه محدودیت داره. شما نمیتونی به هر اندازه دلخواه از حافظه بگیری چون در این روش از حافظه پشته استفاده می کنی که محدودیت داره.
مورد دوم اینه که ابعاد آرایه متغیر باشه که شما باید از malloc استفاده کنی. malloc اشاره گر نیست بلکه مکانیزمی برای گرفتن حافظه از heap هست.
اگر ابعاد آرایه در زمان کامپایل مشخصه از این روش میتونید استفاده کنید:
#define ROWS ...
#define COLS ...
int (*arr)[COLS] = malloc(sizeof *arr * ROWS);
if (arr)
}
do stuff with arr[i][j] //
free(arr)
{
}اگر ابعاد آرایه در زمان کامپایل مشخص نباشه و شما از کامپایلر C99 و C2011 استفاده میکنید، از این روش استفاده کنید size_t rows, cols;
assign rows and cols//
int (*arr)[cols] = malloc(sizeof *arr * rows);
if (arr)
}
do stuff with arr[i][j]//
free(arr);
{
اگر ابعاد آرایه در زمان کامپایل مشخص نباشه و شما از کامپایلر C99 و C2011 استفاده نمیکنید، از این روش استفاده کنید
size_t rows, cols;
// assign rows and cols
int *arr = malloc(sizeof *arr * rows * cols);
{
// do stuff with arr[i * rows + j]
free(arr);
}