Run-Time Check Failure #2 – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Run-Time Check Failure #2 – C / C++ – Fórum – Programujte.comRun-Time Check Failure #2 – C / C++ – Fórum – Programujte.com

 

Al0
Věrný člen
23. 11. 2010   #1
-
0
-

Zdravím, ve svem kodu potřebuji vytvořit dynamické pole typu char, do kterého uživatel zadává čísla. Ovšem nevím, jak velké pole pole bude, jelikož nevím kolik znaků uživatel zadá. Řeším to proto takto:

int main(){

char *x, *y, pom_x, pom_y;

x = nacti_cislo(&pom_x);
y = nacti_cislo(&pom_y);

return 0;
}

char *nacti_cislo(char *zn_x){
cin >> zn_x;

return zn_x;
}


vše v funguje v naprostéím pořádku, ovšem po vypnutí programu Visual Studio vyhodí tuto zprávu:
Run-Time Check Failure #2 - Stack around the variable 'pom_y' corrupted

Vím co to znamená, ovšem nemohu nikde najít řešení. Máte nějaký nápad? díky..

Nahlásit jako SPAM
IP: 158.196.40.–
PSP user|Web developer|C4D user||Maya Lamer|Photoshop User|Guitar player
KIIV
~ Moderátor
+43
God of flame
23. 11. 2010   #2
-
0
-

a kde alokujes pamet?

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Al0
Věrný člen
23. 11. 2010   #3
-
0
-

O to mi prave jde, jak to alokovat..

Nahlásit jako SPAM
IP: 158.196.40.–
PSP user|Web developer|C4D user||Maya Lamer|Photoshop User|Guitar player
Grungy0
Super člen
23. 11. 2010   #4
-
0
-

Akosi nechápem načo vo funkcii nacti_cislo uložíš to čo si načítal do parametra a ešte to aj vrátiš ako návratovú hodnotu?

Keď už tak:

void nacti_cislo(char *zn_x)

{
char veta[1024];
cin>>veta;

zn_x = new char[strlen(veta)+1];
strcpy(zn_x, veta);
}


je to len približne, písal som to z hlavy a treba tam pár vecí ešte dotiahnuť, samozrejme sa dá podobne spraviť aj char* nacti_cislo()

Nahlásit jako SPAM
IP: 158.193.84.–
Prvý náznak hlúposti, je pocit geniality.
kverulant
~ Anonymní uživatel
5 příspěvků
23. 11. 2010   #5
-
0
-

Zálezi na tom co chceš udělat. Pokud chceš načíst jeden znak, tak ti chybí dereference při načítání

cin >> (*zn_x);
. Jinak musíš předat řetězec. Navíc je dobré si předávat i maximální délku řetězce.

To Grungy: občas se to používá pokud chceš potom ten string hned použít. např.
neco_udelej(nacti_cislo(str))

Jinak ten tvůj kód nebude fungovat. Muselo by to být takhle
void nacti_cislo(char **zn_x)

Nahlásit jako SPAM
IP: 84.42.162.–
Al0
Věrný člen
23. 11. 2010   #6
-
0
-

ale ten kod funguje.. akorad po ukonceni vyhodi VS prave tuto chybu.. potrebuju vice znaku je to program ktery nasoby cisla pod sebou jako na papire, a prave nevim jak velke cislo uzivatel zada, proto to resim takto..

Nahlásit jako SPAM
IP: 158.196.40.–
PSP user|Web developer|C4D user||Maya Lamer|Photoshop User|Guitar player
zdenda
~ Anonymní uživatel
257 příspěvků
24. 11. 2010   #7
-
0
-

Funguje, akorát to vyhodí chybu. Vtip dne :) Funguje to jen náhodou, resp. protože překladač vyhodil nebo přesunul x a y, jinak ti to sletí hned. Čteš řetězec znaků, ale máš ukazatel na jeden znak, další znaky přepíšou data za ním. Použij string a máš to bez starostí.

#include <iostream>

#include <string>
using namespace std;
int main()
{
string x, y;
getline(cin, x);
getline(cin, y);
...
}

Nahlásit jako SPAM
IP: 213.211.51.–
kverulant
~ Anonymní uživatel
5 příspěvků
24. 11. 2010   #8
-
0
-

Funguje to nejspíš, protože to pouštíš v debug konfiguraci. Zkus to pustit jako release a nejspíš to sletí. V debug režimu se pokaždé alokuje více než je potřeba a vlastní data jsou uprostřed toho bloku. Takže v tvém případě to naalokuje místo 1 bytu třeba 7 bytů a ty přepíšeš jenom ten ochranný blok (to je význam té chyby), tak ti to náhodou nesletí. Proměnné pom_x a pom_y vytvoř takto:



char pom_x[1000], pom_y[1000];

Nahlásit jako SPAM
IP: 84.42.162.–
Al0
Věrný člen
24. 11. 2010   #9
-
0
-

To zdenda : V release to funguje naprosto stejne jako když použiju debbuger, a to tovje řešení rozhodně fungovat nebude frájo..

To kverulant :
Jako release to jede opravdu stejne jako v debug režimu, chybu vyhodí až po ukončení programu.. Jojo, když vytovřím pom_y jako pole, tak to funguje v pohodš, zajimalo me jestli to jde i se statickou promenou, takže asi nejde.. díky moc!

Nahlásit jako SPAM
IP: 158.196.181.–
PSP user|Web developer|C4D user||Maya Lamer|Photoshop User|Guitar player
KIIV
~ Moderátor
+43
God of flame
24. 11. 2010   #10
-
0
-

To Al : cim to ze soudis ze zdendovo reseni fungovat nebude?
(samozrejme musis se zbavit tech tri tecek co tam dal jako predzvest dalsiho kodu)

jen trochu vysvetleni meho oblibeneho valgrindu (u tveho prvniho kodu):
valgrind --smc-check=all --read-var-info=yes ./a.out
==27741== Memcheck, a memory error detector
==27741== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==27741== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==27741== Command: ./a.out
==27741==
3455555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
234243523453563456345675678567835462567625634567456255467567563454576846723546257547886783566375896773543
==27741== Jump to the invalid address stated on the next line
==27741== at 0x3435333837363538: ???
==27741== by 0x3532363736353235: ???
==27741== by 0x3534373635343335: ???
==27741== by 0x3537363435353235: ???
==27741== by 0x3435343336353735: ???
==27741== by 0x3237363438363734: ???
==27741== by 0x3537353236343532: ???
==27741== by 0x3338373638383733: ???
==27741== by 0x3938353733363634: ???
==27741== by 0x33343533373735: ???
==27741== Address 0x3435333837363538 is not stack'd, malloc'd or (recently) free'd
==27741==
==27741==
==27741== Process terminating with default action of signal 11 (SIGSEGV)
==27741== Bad permissions for mapped region at address 0x3435333837363538
==27741== at 0x3435333837363538: ???
==27741== by 0x3532363736353235: ???
==27741== by 0x3534373635343335: ???
==27741== by 0x3537363435353235: ???
==27741== by 0x3435343336353735: ???
==27741== by 0x3237363438363734: ???
==27741== by 0x3537353236343532: ???
==27741== by 0x3338373638383733: ???
==27741== by 0x3938353733363634: ???
==27741== by 0x33343533373735: ???
==27741==
==27741== HEAP SUMMARY:
==27741== in use at exit: 0 bytes in 0 blocks
==27741== total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==27741==
==27741== All heap blocks were freed -- no leaks are possible
==27741==
==27741== For counts of detected and suppressed errors, rerun with: -v
==27741== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 4 from 4)
Neoprávněný přístup do paměti (SIGSEGV)

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
zdenda
~ Anonymní uživatel
257 příspěvků
24. 11. 2010   #11
-
0
-

To Al : Vysvětlil jsem ti problém a navrhl řešení. Jestli něco nechápeš, tak se zeptej. Nebo si to klidně pras dál, ale pitomosti si nech až zvládneš víc než to prasení.

Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 63 hostů

Podobná vlákna

Polynom - run-time error 201 — založil danny04

Auto run EXE — založil Thebobo

Android run project — založil Peter

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý