D - [Bug] char[dim] -> char[] implicit conversion bug
- Marko Nikolic (21/21) Feb 20 2004 Here is another one. It seems that it has something to do with
-
Ben Hinkle
(37/37)
Feb 20 2004
"Marko Nikolic"
wrote in message - Marko Nikolic (8/33) Feb 20 2004 That's right. I am trying D after many years of not using C (and C++...
- Matthew (4/25) Feb 22 2004 You've taken a slice of something that no longer exists by the time the
Here is another one. It seems that it has something to do with implicit conversion from char[dim] to char[]: markoni titan ~/src/dbug $ cat char.d import std.c.stdio; void main() { char[64] buf; // char[] buf = new char[64]; // it works if replaced with this sprintf(buf, "Hello, World!\n"); printf("buf: %.*s\n", buf); // Works OK throw new Error(buf); // prints garbage } markoni titan ~/src/dbug $ dmd char.d d:\dmd\bin\..\..\dm\bin\link.exe char,,,user32+kernel32/noi; markoni titan ~/src/dbug $ ./char.exe buf: Hello, World! Error: Ç ↕ Regards, Marko
Feb 20 2004
"Marko Nikolic" <markoni69 verat.net> wrote in message news:c15ncd$d91$1 digitaldaemon.com... | Here is another one. It seems that it has something to do with | implicit conversion from char[dim] to char[]: | | markoni titan ~/src/dbug | $ cat char.d | import std.c.stdio; | | void main() { | char[64] buf; | // char[] buf = new char[64]; // it works if replaced with this | | sprintf(buf, "Hello, World!\n"); | printf("buf: %.*s\n", buf); // Works OK | throw new Error(buf); // prints garbage | } The pointer to a local variable on the stack becomes invalid once the scope is exited. Something like throw new Error(buf.dup); will copy the local string from the stack to the heap. Since "new" allocates from the heap that will work, too. | | markoni titan ~/src/dbug | $ dmd char.d | d:\dmd\bin\..\..\dm\bin\link.exe char,,,user32+kernel32/noi; | | markoni titan ~/src/dbug | $ ./char.exe | buf: Hello, World! | | Error: Ç ? | | Regards, | Marko
Feb 20 2004
Ben Hinkle wrote:"Marko Nikolic" <markoni69 verat.net> wrote in message news:c15ncd$d91$1 digitaldaemon.com... | Here is another one. It seems that it has something to do with | implicit conversion from char[dim] to char[]: | | markoni titan ~/src/dbug | $ cat char.d | import std.c.stdio; | | void main() { | char[64] buf; | // char[] buf = new char[64]; // it works if replaced with this | | sprintf(buf, "Hello, World!\n"); | printf("buf: %.*s\n", buf); // Works OK | throw new Error(buf); // prints garbage | } The pointer to a local variable on the stack becomes invalid once the scope is exited. Something like throw new Error(buf.dup); will copy the local string from the stack to the heap. Since "new" allocates from the heap that will work, too.That's right. I am trying D after many years of not using C (and C++ even more - I never liked C++) - I used mainly Java and scripting languages) so I got very comfortable in not having memory management in mind ;> Thanks for your help. Regards, Marko
Feb 20 2004
You've taken a slice of something that no longer exists by the time the slice is used. "Marko Nikolic" <markoni69 verat.net> wrote in message news:c15ncd$d91$1 digitaldaemon.com...Here is another one. It seems that it has something to do with implicit conversion from char[dim] to char[]: markoni titan ~/src/dbug $ cat char.d import std.c.stdio; void main() { char[64] buf; // char[] buf = new char[64]; // it works if replaced with this sprintf(buf, "Hello, World!\n"); printf("buf: %.*s\n", buf); // Works OK throw new Error(buf); // prints garbage } markoni titan ~/src/dbug $ dmd char.d d:\dmd\bin\..\..\dm\bin\link.exe char,,,user32+kernel32/noi; markoni titan ~/src/dbug $ ./char.exe buf: Hello, World! Error: Ç ? Regards, Marko
Feb 22 2004