char* pointers between C and D

ryuukk_ ryuukk.dev at gmail.com
Mon Jul 25 13:51:35 UTC 2022


On Monday, 25 July 2022 at 11:14:56 UTC, pascal111 wrote:
> On Monday, 25 July 2022 at 09:36:05 UTC, ryuukk_ wrote:
>> Here is the way to do it with `writefln` (i think)
>>
>>
>> ```D
>> import std;
>> import core.stdc.string;
>>
>> void main()
>> {
>>     const(char)[] ch = "Hello World!";
>>     const(char)[] ch2 = "abc";
>>     const(char)* p;
>>
>>     p = &ch[0];
>>     p++;
>> 	
>>     auto str = p[0 .. strlen(p)];
>>     writefln("%s", str);
>> }
>> ```
>>
>> Note that i removed your `.dup` it is unecessary, string 
>> literals needs `const(char)`
>>
>> After looking at the doc, `writefln` needs a slice, so we just 
>> do that and pass it
>
> 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




More information about the Digitalmars-d-learn mailing list