Cdagi magistral ko'rsatgich to'g'ridan-to'g'ri mag'lubiyatga to'g'ridan-to'g'ri tayinlanishi mumkinmi?

Quyidagi dastur yaxshi ishlaydi va men nima uchun ajablanib:

#include 
#include 
#include 
#include 

void xyz(char **value)
{
       //*value = strdup("abc");
        *value = "abc";//<-- ??????????
}

int main(void)
{
        char *s1;

        xyz(&s1);

        printf("s1 : %s \n", s1);
}

Chiqish:

s1 : abc

Mening tushunishimga ko'ra, xotirani ajratmagan xotira uchun C kodini ajratish uchun strdup() funktsiyasidan foydalanishim kerak edi. Lekin, bu holda dastur faqat "" yordamida string qiymatini belgilash orqali yaxshi ishlaydi, har kim tushuntirishi mumkinmi?

3
Sizning kodingizda hech qanday xatolik yo'q, sizning holingizda "abc" - bu satrning literali (faqat o'qish uchungina segmentga joylashtirilgan), shuning uchun sizga bo'sh joy ajratishga hojat yo'q (lekin ushbu ma'lumot segmentini o'zgartirishga ruxsat berilmaydi) code> s1 [0] = 'x'; )
qo'shib qo'ydi muallif Keine Lust, manba
Rahmat. Endi "abc" kompilyatsiya vaqtida xotirada saqlanadi va xyz() funktsiyasini necha marta chaqirishidan qat'i nazar, fix manzilga ega bo'ladi, "abc" xotirasi bir necha marta berilmasligini tushunaman.
qo'shib qo'ydi muallif androidFan, manba

6 javoblar

Eterda satr literalleri mavjud emas. Ular dastur xotirasida yashaydi va manzilga ega.

Natijada siz ushbu manzilni ko'rsatuvchilarga belgilashingiz mumkin. Sizning dasturingizning xatti-harakati yaxshi aniqlangan va hech qanday yomon narsa bo'lmaydi, shuning uchun siz ko'rsatgich orqali modifikatsiyani ga ishora qilmang.

Shuning uchun, derazani to'g'ri ishlashi uchun siz uchun derleyici ishini bajarish yaxshidir. Mumkin turini imkon qadar konst sifatida belgilashni afzal ko'rasiz va derleyici sizni modifikatsiya qilishga urinadi.

#include 
#include 
#include 
#include 

void xyz(char const **value)
{
        *value = "abc";
}

int main(void)
{
        char const *s1;

        xyz(&s1);

        printf("s1 : %s \n", s1);
        s1[0] = 'a'; << Error on this line
}
7
qo'shib qo'ydi

Eterda satr literalleri mavjud emas. Ular dastur xotirasida yashaydi va manzilga ega.

Natijada siz ushbu manzilni ko'rsatuvchilarga belgilashingiz mumkin. Sizning dasturingizning xatti-harakati yaxshi aniqlangan va hech qanday yomon narsa bo'lmaydi, shuning uchun siz ko'rsatgich orqali modifikatsiyani ga ishora qilmang.

Shuning uchun, derazani to'g'ri ishlashi uchun siz uchun derleyici ishini bajarish yaxshidir. Mumkin turini imkon qadar konst sifatida belgilashni afzal ko'rasiz va derleyici sizni modifikatsiya qilishga urinadi.

#include 
#include 
#include 
#include 

void xyz(char const **value)
{
        *value = "abc";
}

int main(void)
{
        char const *s1;

        xyz(&s1);

        printf("s1 : %s \n", s1);
        s1[0] = 'a'; << Error on this line
}
7
qo'shib qo'ydi

"abc" string belgilar majmualaridan iborat bo'lsa, dasturning ishlashi juda yaxshi ishlaydi va ko'rsatgichga bitmapli so'zni belgilashda aslida nima sodir bo'lsa, derleyici birinchi navbatda belgi qatorini hosil qiladi va keyin birinchi qator qatori boshqa elementlarning nomini chaqirishga o'xshaydi. shuning uchun sizda dasturda xyz funktsiyasiga char-pointerning manzilini berdingiz va

*value = "abc";

Bu tushuntirish uchun kompilyator avval xotirada belgilar majmuasini yaratadi va navbatida o'z manzilini qaytaradi, bu esa o'z navbatida char pointerda saqlanadi. Kompilyator char majmuasini faqat xotirada o'qish uchun yaratadi, deb bilish kerak.Shunday qilib, qiymatini o'zgartirishga bo'lgan har qanday urinish uni kompilyatsiya qilish vaqtidagi xatolarni qaytaradi.

3
qo'shib qo'ydi

"abc" string belgilar majmualaridan iborat bo'lsa, dasturning ishlashi juda yaxshi ishlaydi va ko'rsatgichga bitmapli so'zni belgilashda aslida nima sodir bo'lsa, derleyici birinchi navbatda belgi qatorini hosil qiladi va keyin birinchi qator qatori boshqa elementlarning nomini chaqirishga o'xshaydi. shuning uchun sizda dasturda xyz funktsiyasiga char-pointerning manzilini berdingiz va

*value = "abc";

Bu tushuntirish uchun kompilyator avval xotirada belgilar majmuasini yaratadi va navbatida o'z manzilini qaytaradi, bu esa o'z navbatida char pointerda saqlanadi. Kompilyator char majmuasini faqat xotirada o'qish uchun yaratadi, deb bilish kerak.Shunday qilib, qiymatini o'zgartirishga bo'lgan har qanday urinish uni kompilyatsiya qilish vaqtidagi xatolarni qaytaradi.

3
qo'shib qo'ydi

C kodini char * str = "some string"; bilan belgilashingiz mumkin, str - bu satrda birinchi harfning o'rnini ko'rsatuvchi ko'rsatgich.

1
qo'shib qo'ydi

C kodini char * str = "some string"; bilan belgilashingiz mumkin, str - bu satrda birinchi harfning o'rnini ko'rsatuvchi ko'rsatgich.

1
qo'shib qo'ydi