انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


ارائه ۲۴٫۱۰ اوبونتو منتشر شد 🎉

نویسنده موضوع: حافظه تکراری در c  (دفعات بازدید: 656 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین ابو مصعب

  • Jr. Member
  • *
  • ارسال: 28
  • جنسیت : پسر
  • ازادی گنو/لینوکس بی منت
حافظه تکراری در c
« : 31 شهریور 1401، 12:51 ق‌ظ »
سلام یک برنامه لاگ همین جوری برای c  نوشته بودم که قابلیت رنگ داشت . اما متوجه شدم یک چیزی غیر عادیه . این بود که فایل main.c به شرح زیر :‌#include <stdio.h>
#include "includes/log.c"
int main() {
    normal("going to RUN");
    warning("gggg");
    dangerous("adfasdf");


}


و فایل log.c :


#include <stdio.h>
#include <string.h>
// colors :
#define RED    "\e[31m"
#define GREEN  "\e[32m"
#define YELLOW "\e[33m"
// rest code :
#define REST   "\e[0m"


void println(const char *text){
printf("%s\n",text);
}
void normal(const char *text ) {
println(text);
}
void warning(const char *text) {
char final_msg[100];
strcat(final_msg,YELLOW);
strcat(final_msg,text);
strcat(final_msg,REST);
println(final_msg);
}
void dangerous(const char *text) {
char final_msg[100];
strcat(final_msg,RED);
strcat(final_msg,text);
strcat(final_msg,REST);
println(final_msg);
}



اما خروجی این بود :‌
going to RUN
gggg
ggggadfasdf

همون طور که میبیند gggg که مثلا برا هشداره دوبار داره نمایش داده میشه . و وقتی کد رو به این صورت تغییر دادم :‌

void dangerous(const char *text) {
char final_msg[100];
println(final_msg);
strcat(final_msg,RED);
strcat(final_msg,text);
strcat(final_msg,REST);
println(final_msg);
}


متوجه شدم که متغیر final_msg هنو مقداری رو داره که توی فانکشن بالایی مشابهش وجود داره و هنو همون مقدار رو داره . اما مگه تو سی متغیر ها از هم جدا نیستند ؟ چرا این اتفاق میوفته ؟‌
برای استعمار گران کاملا طبیعی است که با دینی هم اواز شوند . که به مردم می اموزد بخاطر بهشت موهوم در اسمان ، جهنم روی زمین را بی گلایه تحمل کنند .

آفلاین esmaeelE

  • ناظر انجمن
  • *
  • ارسال: 1270
  • جنسیت : پسر
پاسخ : حافظه تکراری در c
« پاسخ #1 : 09 آبان 1401، 02:30 ب‌ظ »
باید آرایهٔ کاراکتری را مقدار دهی اولیه کنید.
char final_msg[100]={0};


کد‌های e\ غیر استاندارد است. توصیه شده که به جای اون از 33\ استفاده کنید.

با این تغییرات کد به این شکل می‌شود.


#include <stdio.h>
#include <string.h>

// colors :
#define RED    "\033[31m"
#define GREEN  "\033[32m"
#define YELLOW "\033[33m"
#define REST   "\033[0m"


void println(const char *text){
printf("%s\n",text);
}
void normal(const char *text ) {
println(text);
}
void warning(const char *text) {
char final_msg[100]={0};
strcat(final_msg,YELLOW);
strcat(final_msg,text);
strcat(final_msg,REST);
println(final_msg);
}
void dangerous(const char *text) {
char final_msg[100]={0};
strcat(final_msg,RED);
strcat(final_msg,text);
strcat(final_msg,REST);
println(final_msg);
}

int main(void) {
    normal("going to RUN");
    warning("gggg");
    dangerous("adfasdf");
    return 0;
}


می‌توانید برای کار با رشته‌ها از توابع امن‌تری چون strncat هم استفاده کنید.
void dangerous(const char *text) {
char final_msg[100];
strncat(final_msg,RED, strlen(RED));
strncat(final_msg,text, strlen(text));
strncat(final_msg,REST, strlen(REST));
println(final_msg);
}

« آخرین ویرایش: 09 آبان 1401، 02:45 ب‌ظ توسط esmaeelE »