extern (C) function call with const char * type will sometimes generate seg fault or core dump.

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Oct 15 23:56:19 PDT 2014


On 10/15/2014 08:18 PM, dysmondad wrote:

 > Since I've added this call, my program will sometimes but not always
 > either generate a core dump or a seg fault. It seems that the issue is
 > with the const char * parameter.
 >
 > I don't have a good grasp of the difference between the way D and C work
 > for char * types. The call to loadTexture uses a literal for the file
 > name, i.e. "resources/ball.png".
 >
 > // d lang bindings for C function
 > alias void SDL_Renderer;
 > alias void SDL_Texture;
 > extern (C) SDL_Texture * IMG_LoadTexture(SDL_Renderer * renderer, const
 > char * file);
 >
 > // d lang call to extern (C) function
 > SDL_Texture* loadTexture( SDL_Renderer * ren,  const char * file )
 > {
 >      SDL_Texture * loadedImage = IMG_LoadTexture( ren, file );
 >      return loadedImage;
 > }

I wouldn't expect to see strings represented as 'const char *' on D 
side. The more convenient and safer option is to use 'string' on the D 
side and pass it through toStringz() before calling C.

The D function now takes 'string' and calls toStringz() on it:

SDL_Texture* loadTexture( SDL_Renderer * ren,  string file )
{
      SDL_Texture * loadedImage = IMG_LoadTexture( ren, file.toStringz);
      return loadedImage;
}

However, note the lifetime issue:

   http://dlang.org/phobos/std_string.html#.toStringz

Ali



More information about the Digitalmars-d-learn mailing list