I could imagine that returning the c_str() is not a good idea. Maybe you pass a char* buffer instead, in which you write the result?

Code:
DLLFUNC char* sqlite__select(char* buffer, int r, int c)
{
    if (buffer != NULL)
        strcpy(buffer, result[r][c].c_str());
        
    return buffer;
}



Code:
void test_select ()
{
    int rows = sqlite_rows();
    
    char buffer [256];
    
    int ping;
    for (ping = 0; ping < rows; ping++)
    {
        printf("%s", sqlite_select(buffer, ping, 0));
        printf("%s", sqlite_select(buffer, ping, 1));
        printf("%s", sqlite_select(buffer, ping, 3));
    }
}