| | |
| Stránka: 1 z 1
| [ Príspevkov: 9 ] | |
Autor | Správa |
---|
Registrovaný: 11.10.09 Prihlásený: 23.06.22 Príspevky: 289 Témy: 51 Bydlisko: Kysucké Nov... |
zdravim,
ucim sa na skusku z programovania, a v prednaskovych prezentaciach je nieco taketo :
celkom nechapem ako sa moze k tym ukazovatelom na premenne pristupovat tak, ako to tam je napisane.
Ani mi to nejde skompilovat.
Podla mna sa musi pole najskor alokovat a potom naplnit, ale aj tak sa nevyhnem pouzitiu fcie strcpy().
Teda takto mi to funguje (nemam presne taku istu strukturu ako je v prezentacii-nechcelo sa mi tolko pisat):
Kód: #include <stdio.h> #include <conio.h> #include <string.h>
int main() { struct zakaznik { char *priezvisko; char *meno; int cena_nakupu; };
struct zakaznik z1;
z1.priezvisko = (char*) malloc(strlen("Mrkvicka") + 1); if(z1.priezvisko == NULL){ printf ("chyba"); exit (-1); } strcpy (z1.priezvisko, "Mrkvicka");
z1.meno = (char*) malloc(strlen("Janko") + 1); if(z1.meno == NULL){ printf ("chyba"); exit (-1); } strcpy (z1.meno, "Janko");
z1.cena_nakupu = 200;
printf("\t%s\n", z1.priezvisko); printf("%s\n", z1.meno); printf("%d\n", z1.cena_nakupu);
free (z1.priezvisko); free (z1.meno);
z1.priezvisko = NULL; z1.meno = NULL;
getch(); return 0; }
Je chyba v prezentacií alebo to ja zle chápem?
_________________ cpu intel c2q9550, 2.83GHz @ 3.91 GHz gpu asus eah4890 hdti 1GD5 1Gb ddr5 pcx zakl.doska asus p5q e HDD samsung 1Tb sata2 32Mb ram a-data ddr2 4x2Gb 1066+MHz Extreme zdroj fortron everest 600w 80+ skrinka enermax staray blue monitor LG 23" LCD W2343T-PF 2ms FULL HD DVI reproduktory Creative T6100 5.1 |
|
Registrovaný: 11.01.09 Prihlásený: 03.05.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 03.01.2012 15:45 | |
|
V prednaske je chyba, nema tam byt:
Kód: stitok.priezvisko, "Novotna"; stitok.meno, "Tereza"; ... ale ma tam byt znak rovna sa: Kód: stitok.priezvisko = "Novotna"; stitok.meno = "Tereza"; ...
V tomto zapise ide o to, ze v pamati iba na citanie sa vytvori retazec "Novotna", ktoreho adresa sa iba preda premennej stitok.priezvisko. Ak by si ju chcel neskor modifikovat, napr stitok.priezvisko[0] = 'R', pripadne by si volal strcpy na tuto adresu, dostal by si segmentation fault.
|
|
Registrovaný: 11.10.09 Prihlásený: 23.06.22 Príspevky: 289 Témy: 51 Bydlisko: Kysucké Nov... | Napísal autor témy t-pack25: 03.01.2012 16:10 | |
|
Dakujem za objasnenie.
Tak ma napada otazka, je vobec na nieco dobry takyto zapis? (Ked pises, ze retazec je iba na citanie)...alebo lepsie povedane, pouziva sa takyto zapis? (teraz neriesim, ze v praxi by sa pouzili zrejme databazy)
_________________ cpu intel c2q9550, 2.83GHz @ 3.91 GHz gpu asus eah4890 hdti 1GD5 1Gb ddr5 pcx zakl.doska asus p5q e HDD samsung 1Tb sata2 32Mb ram a-data ddr2 4x2Gb 1066+MHz Extreme zdroj fortron everest 600w 80+ skrinka enermax staray blue monitor LG 23" LCD W2343T-PF 2ms FULL HD DVI reproduktory Creative T6100 5.1 |
|
Registrovaný: 11.01.09 Prihlásený: 03.05.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 03.01.2012 16:16 | |
|
Takto - menit sa sice nemoze, ale len tento konkretny retazec. Premennej stitok.priezvisko mozes kedykolvek priradit iny retazec ( ci uz cez malloc alokovat novu pamat, alebo cez znak = mu pridelit inu adresu s retazcom ). Takze vyuzitie moze mat, ak napriklad potrebujes povedzme nejaku defaultnu hodnotu uz v dobe pisania programu a potom budes potrebovat novu hodnotu retazca.
|
|
Registrovaný: 14.03.11 Prihlásený: 30.04.24 Príspevky: 814 Témy: 23 Bydlisko: Bratislava |
Nerozumiem aká je výhoda zápisu
Kód: z1.priezvisko = (char*) malloc(strlen("Mrkvicka") + 1);
Alokuješ pamäť presne na KONŠTANTU čo si uviedol.
V tých príkladoch je to normálne, alokuje sa 40 bajtov... // pridané po 7 minútach od posledného príspevkuFico píše: Takto - menit sa sice nemoze, ale len tento konkretny retazec. Premennej stitok.priezvisko mozes kedykolvek priradit iny retazec ( ci uz cez malloc alokovat novu pamat, alebo cez znak = mu pridelit inu adresu s retazcom ). Takze vyuzitie moze mat, ak napriklad potrebujes povedzme nejaku defaultnu hodnotu uz v dobe pisania programu a potom budes potrebovat novu hodnotu retazca.
No, ak je to alokovaný buffer, aj strcpy by malo zafungovať, nie?
Ak je to pointer, tak sa jeho hodnota prepíše iným pointrom.
?
|
|
Registrovaný: 11.01.09 Prihlásený: 03.05.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 03.01.2012 17:24 | |
|
marian_r píše: No, ak je to alokovaný buffer, aj strcpy by malo zafungovať, nie?
Nie nie, praveze strcpy robi to, ze na adresu, ktora je predana ako prvy parameter zacne zapisovat znaky pocnuc adresou, ktoru predame ako druhy parameter. Ale kedze je tento retazec ulozeny v read-only pamati, program spadne so Segmentation fault ( pretoze sa pokusame zapisovat na nepristupnu pamat ). Skuste si nasledujuci priklad pre ilustraciu:
Kód: #include <stdio.h> #include <string.h>
int main() {
char *text = "Toto je text ulozeny v pamati na citanie";
strcpy( text, "Pokus prepisat konstantny text" ); return 0;
} Nasledujuci kod uz ale pojde, pretoze premennej pridelime novu adresu, ktora nie je v read-only sekcii: Kód: #include <stdio.h> #include <stdlib.h> #include <string.h>
int main() {
char *text = "Toto je text ulozeny v pamati na citanie";
text = malloc( 100 ); if ( text != NULL ) { strcpy( text, "Toto uz je platny zapis, pretoze text ma pridelenu novu adresu" ); printf( "%s\n", text ); }
free( text ); return 0;
}
|
|
Registrovaný: 14.03.11 Prihlásený: 30.04.24 Príspevky: 814 Témy: 23 Bydlisko: Bratislava |
t-pack25 píše: Podla mna sa musi pole najskor alokovat a potom naplnit, ale aj tak sa nevyhnem pouzitiu fcie strcpy().
Lenže tým zápisom s ukazovateľmi JE naalokované. Na ukazovatele a hodnotu ukazovateľa môžeš prepísať inou hodnotou ukazovateľa smerujúceho na iný reťazec. // pridané po 3 minútach od posledného príspevkuFico píše: Nie nie, praveze strcpy robi to, ze na adresu, ktora je predana ako prvy parameter zacne zapisovat znaky pocnuc adresou, ktoru predame ako druhy parameter.
S tým nemám problém, je mi jasné že nemôže/nemal by zapisovať do alokovanej konštanty.
Ak má alokovanú premennú char[40] tak strcpy
ak má pointer char * tak =
.
Nie? O to išlo v tých ukážkach.
|
|
Registrovaný: 11.01.09 Prihlásený: 03.05.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 03.01.2012 17:38 | |
|
marian_r píše: Ak má alokovanú premennú char[40] tak strcpy ak má pointer char * tak = .
Nie? O to išlo v tých ukážkach.
Presne tak, len ak mame smernik char*, mozme pouzit aj dynamicku alokaciu pomocou malloc.
|
|
Registrovaný: 11.10.09 Prihlásený: 23.06.22 Príspevky: 289 Témy: 51 Bydlisko: Kysucké Nov... | Napísal autor témy t-pack25: 03.01.2012 20:12 | |
|
Vdaka Vam vsetkym, uz tomu rozumiem
_________________ cpu intel c2q9550, 2.83GHz @ 3.91 GHz gpu asus eah4890 hdti 1GD5 1Gb ddr5 pcx zakl.doska asus p5q e HDD samsung 1Tb sata2 32Mb ram a-data ddr2 4x2Gb 1066+MHz Extreme zdroj fortron everest 600w 80+ skrinka enermax staray blue monitor LG 23" LCD W2343T-PF 2ms FULL HD DVI reproduktory Creative T6100 5.1 |
|
| Stránka: 1 z 1
| [ Príspevkov: 9 ] | |
Podobné témy | Témy | Odpovede | Zobrazenia | Posledný príspevok |
---|
| Ukazovatele (pointers) na funkciu (vyznam) v C++ otazka v Assembler, C, C++, Pascal, Java | 3 | 755 | 02.02.2016 19:32 Elendil | | jazyk v Operačné systémy Microsoft | 6 | 603 | 16.12.2009 17:52 Freelan | | jazyk v PHP, ASP | 2 | 545 | 29.06.2009 18:20 emer | | jazyk v Operačné systémy Microsoft | 4 | 597 | 24.12.2008 4:55 mithequessir | | Vista jazyk v Operačné systémy Microsoft | 1 | 298 | 11.09.2010 22:42 shiro | | Web jazyk v Webdesign | 6 | 620 | 17.11.2008 11:20 suchy | | Jazyk klávesnice v Assembler, C, C++, Pascal, Java | 9 | 1098 | 11.07.2011 16:04 johny3212 | | jazyk webu v PHP, ASP | 15 | 1102 | 15.03.2009 17:24 kaidžas | | jazyk stranky v PHP, ASP | 6 | 491 | 16.01.2009 19:59 kaidžas | | aky jazyk [ Choď na stránku: 1, 2 ] v Assembler, C, C++, Pascal, Java | 47 | 2853 | 08.12.2008 20:03 stopa27 | | aký jazyk? v Ostatné | 2 | 561 | 17.01.2010 21:55 Merlin_sk | | Programovací jazyk v Assembler, C, C++, Pascal, Java | 17 | 893 | 12.10.2011 13:44 Fico | | Jazyk PC v Notebooky a netbooky | 12 | 361 | 28.09.2013 20:01 SamerLp | | jazyk C v Assembler, C, C++, Pascal, Java | 5 | 429 | 15.04.2013 22:06 marian_r | | jazyk C v Assembler, C, C++, Pascal, Java | 9 | 984 | 10.04.2009 13:19 neutronmind | | Jazyk C v Assembler, C, C++, Pascal, Java | 17 | 1067 | 11.02.2011 23:55 walther |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|