char* pointers between C and D
pascal111
judas.the.messiah.111 at gmail.com
Mon Jul 25 17:30:14 UTC 2022
On Monday, 25 July 2022 at 13:51:35 UTC, ryuukk_ wrote:
> On Monday, 25 July 2022 at 11:14:56 UTC, pascal111 wrote:
>> On Monday, 25 July 2022 at 09:36:05 UTC, ryuukk_ wrote:
>>> [...]
>>
>> I tried your advice with two ways; once with a constant and
>> other with an array, but the result isn't the same. The array
>> case has more letters in the output.
>>
>>
>> module main;
>>
>> import std.stdio;
>> import core.stdc.stdio;
>> import core.stdc.string;
>>
>> int main(string[] args)
>> {
>>
>>
>> const(char)[] ch1 = "Hello World!";
>> char[] ch2="Hello World!".dup;
>>
>> const(char) *p1;
>> char *p2;
>>
>> p1=ch1.ptr;
>> p2=ch2.ptr;
>>
>> writeln(p1[0..strlen(p1)]);
>> writeln(p2[0..strlen(p2)]);
>>
>> return 0;
>> }
>>
>>
>> Runtime output:
>>
>> https://i.postimg.cc/sfnkJ4GM/Screenshot-from-2022-07-25-13-12-03.png
>
> `ch1`is a string literal, just like in C, it is null terminated
>
> `ch2` is a GC allocated char array, it is NOT null terminated
>
> `strlen` is the lib C function, it counts strings up to `\O`
>
> for `p1` it'll print correctly, it is a pointer from the null
> terminated string
>
> for `p2` strlen doesn't make sense, since it is a pointer from
> a string that is NOT null terminated
Yes, I have to add "\0":
module main;
import std.stdio;
import core.stdc.stdio;
import core.stdc.string;
int main(string[] args)
{
const(char)[] ch1 = "Hello World!";
char[] ch2="Hello World!".dup;
const(char) *p1;
char *p2;
ch2~="\0";
p1=ch1.ptr;
p2=ch2.ptr;
writeln(p1[0..strlen(p1)]);
writeln(p2[0..strlen(p2)]);
return 0;
}
More information about the Digitalmars-d-learn
mailing list