|
| underlige visual c compiler Fra : Bo Helleskov |
Dato : 17-06-02 07:59 |
|
Hej Alle,
Jeg har et problem med "visual c 6" compileren.
Når jeg compiler nedstående kode til "debug-mode" og prøver at køre
kode,
får jeg følgende fejl: "Unhandled exception in .....exe: 0xC000005:
Access Violation".
Hvis jeg derimod compiler til "release-mode" og kører, ja så
fungere koden fint!
Det giver mig hovedbrud! Mit næste skridt er at begynde at sammenligne
"debug"-assembler-koden med "release"-assembler-koden, for at se om
der
er nogle forskelle.
Kan nogle forklare det ??
/Bo
#include <tchar.h>
#include <iostream>
using namespace std;
void f(TCHAR* p);
int main( void )
{
TCHAR* t = "0000000";
cout << "Before f(): " << t << endl;
f(t);
cout << "After f(): " << t << endl;
return 0;
}
void f(TCHAR* p) {
while (*p) {
*p++ = '1';
}
cout << endl;
}
| |
Jonas Meyer Rasmusse~ (17-06-2002)
| Kommentar Fra : Jonas Meyer Rasmusse~ |
Dato : 17-06-02 10:07 |
|
Hejsa.
"Bo Helleskov" <helleskov@vip.cybercity.dk> wrote in message
news:526d97bb.0206162259.50eb02c7@posting.google.com...
> #include <tchar.h>
> #include <iostream>
> using namespace std;
>
> void f(TCHAR* p);
> int main( void )
> {
> TCHAR* t = "0000000";
Når du opretter et string literal, så kommer det til at ligge i det
dataområde, der kendes som "const data".
I C++ må du ikke modificere data der ligger i dette dataområde.
>
> cout << "Before f(): " << t << endl;
> f(t);
>
> cout << "After f(): " << t << endl;
>
> return 0;
> }
>
> void f(TCHAR* p) {
> while (*p) {
> *p++ = '1';
Da p peger ind i const data området får du sikkert en fejl i denne linie, da
du her prøver at modificere den data som ligger
i "const data" området.
> }
> cout << endl;
> }
Grunden til at du kun får fejlen, er formentligt at VC kun kontrollerer at
du overholder reglerne i debug mode -
i release mode, er denne kontrol fjernet. Da oversætteren så åbenbart lægger
string literalet i et ikke konstant dataområde,
så kan du fint modificere det.
Du kan løse problemet simpelt..
blot erstat
TCHAR* t = "0000000";
med
TCHAR[] t = "0000000";
Dette gør at der bliver oprettet et array på stakken, indeholdende en kopi
af string literalet
i det konstante dataområde.
Dit program vil så køre fint
mvh Jonas
| |
Bo Helleskov (17-06-2002)
| Kommentar Fra : Bo Helleskov |
Dato : 17-06-02 18:13 |
|
Hej Jonas,
Tak for svaret, jeg fandt ud af det ved at gå
igennem assembler koden. Følgende stod:
CONST SEGMENT
??_C@_06GEKNBBDK@000000?$AA@ DB '000000', 00H ; `string'
; Function compile flags: /Odt /RTCsu /ZI
CONST ENDS
og derfor må jeg selvfølgelig ikke ændre i den.
Tak
Bo
| |
|
|