* Char * функциясына өтсе, жадтың ағып кетуіне әкеледі

Менде келесідей функция бар:

void readString(char* str){
  str="asd";
}

str деп бөлуге болады ма? Немесе оны босатуға тиіспін бе?

Ескерту: Мен микропроцессорды бағдарламалаған кезде жол кітапханасын пайдалана алмаймын.

0
@juanchopanza, ....... Мүмкін, бұл менің түсініктемеіммен маңызды еді: p
қосылды автор chris, көзі
@Corbin - жергілікті айнымалы емес str ? Бұл функцияны шақыру әсер етпеуі керек.
қосылды автор juanchopanza, көзі
@ user1764961 С әлеміндегі болжамдар әрқашан өте жақсы аяқталады :)
қосылды автор Corbin, көзі
Wow. Мен жай ғана секундына ақылсыз болып кеттім. Өте жақсы нәрсе! Мен оны char ** x.x ретінде оқып шыққаныма сенімді емеспін
қосылды автор Corbin, көзі
@Corbin, Шелдон Купер режімінің кезегі, біз ОС-тың шынымен сұрағандарын білеміз.
қосылды автор user1764961, көзі

6 жауаптар

free() must only be called if malloc(), calloc() or realloc() was used to allocate memory. This is not the case in the posted code so calling free() is unrequired.

«asd» - жолдың литералы және бағдарламаның қызмет ету мерзімі (статистикалық сақтау ұзақтығы) бар.

5
қосылды
Бұл нақты жауап, +1
қосылды автор Bathsheba, көзі

Сіздің функцияңыз ештеңе жасамайды.

Жолды «оқымайды». Мұның бәрі функцияның жергілікті координатына str жолының литералы мекен-жайын (жолдың мәтініне баптандырылған тұрақты жад блогын) тағайындайды. Сонда функция жергілікті айнымалы мәнді тоқтатуды тоқтатады.

Еш ештеңе қайтарылмайды, және көрсеткіш дефайлға жатпайды (бұл өз кезегінде қате болуы мүмкін, себебі char * * емес, тек char * ), сондықтан ештеңе болмайды функциядан тыс. Қоңырау шалушы ешқандай мәнді «қабылдамайды» және осылайша ешқашан ештеңе тудырмайды free() , бұл мәселе ешқашан болмайды.

3
қосылды
Жалғыз жауап үшін +1 ОС-ның кодын қарап отырады.
қосылды автор Lundin, көзі

String статикалық жадта сақталғандықтан бөлінбейді. Сіз оны бөлмегенсіз, оны босатпаңыз

2
қосылды

Бұл кодекс маған пайдасыз болғандықтан пайдасыз және мағынасыз. Міне, сіздің функцияңызды анықтаудың әртүрлі әдістерін және неге бұл туралы айтқым келеді!

int main (int argc, char *argv[], char *envp[])
{
    char a, *b, *c;

    b = malloc (10);

    readString(&a);//Case-1, Valid calling.
    readString(b);//Case-2, Valid calling.
    readString(c);//Case-3, Invalid calling. Unallocated location.
}

Case-1: Бұл сіздің қоңырау шалушыға сіздің функцияңыздағы әрекеттер туралы маңызды болған жағдайда ғана. Өткізілген таңбаны қалағаныңызша пайдалана аласыз. Жалғыз мағыналы тапсырма бұған ұқсас еді. Doing 'str = «asd»;' қоңырау шалушының жинағы немесе деректер сегменті жады (егер жаһандық ауыспалы адрес берілсе) және ядродағы қиындықты тудыруы мүмкін қасірет тудыруы мүмкін.

void readString(char* str){
    *str='a';
}

Case-2: кодта қателік немесе синтаксис қатесі жоқ, бірақ мұны істеу мүмкін емес. Тек мағыналы нәрсе, тек қоңырау шалушыдан өзіңіздің функцияңызға өткен нәрсені пайдалану. Ұсынылған параметрде осындай тағайындаудың себебі неде? Сіздің анықтамаңыз жергілікті айнымалы болуы мүмкін және параметрді толығымен өтпеуі мүмкін. Бұл функцияны «readString ();» деп атауға болады ...

void readString(void){
    char *str='asd';
}
0
қосылды

Жоқ, жадтың ағуы жоқ. Сіздің жағдайда бұл статистикалық түрде бөлінген.

0
қосылды

Жалпы алғанда, сіз өзіңіздің жадты кім босатуға немесе босатуға қатысты өз ережелеріңізді жасауыңыз керек, және сіздің кодты құжаттауыңыз керек, сондықтан талаптардың қандай екендігі анық.

Берілген мысалда, readString() тек көрсеткіштің жеке көшірмесін қайта жазады және ол қайтарған кезде, ештеңе өзгерген жоқ. Демек, қоңырау шалушы readString() дегенге дейін free() деген көрсеткішке ұқсас болады және ешқандай ағып кетпейді.

Алайда readString() орнына char ** параметрін қабылдаса, онда ол шалушының шеберінің көшірмесін өзгерте алады, сонан соң нәтиже заңды болмас еді readString() шақырғаннан кейін free() деп қоңырау шалу үшін, көрсеткіштің жаңа мәні malloc үйірмесінің бөлігі емес.

Егер осы көрсеткіштің айнымалы мәнінің алдыңғы мәні malloc() ed нысаны болса, онда қоңырау шалушы көрсеткішті қайта жазуға рұқсат бермес бұрын оны босатуы керек. Бұл жағдайда readString() қоңырау free() деген шынымен қорқынышты болар еді, өйткені ол, ақырында, ешқашан босатылмайтын , ал бағдарламаның ағыны ұстану өте қиын еді.

0
қосылды