diff --git a/include/libssh2.h b/include/libssh2.h
index 890749e..01f1cc3 100644
--- a/include/libssh2.h
+++ b/include/libssh2.h
@@ -372,7 +372,8 @@ LIBSSH2_API LIBSSH2_SESSION *
 libssh2_session_init_ex(LIBSSH2_ALLOC_FUNC((*my_alloc)),
                         LIBSSH2_FREE_FUNC((*my_free)),
                         LIBSSH2_REALLOC_FUNC((*my_realloc)), void *abstract);
-#define libssh2_session_init() libssh2_session_init_ex(NULL, NULL, NULL, NULL)
+LIBSSH2_API LIBSSH2_SESSION *
+libssh2_session_init(void);
 
 LIBSSH2_API void **libssh2_session_abstract(LIBSSH2_SESSION *session);
 
diff --git a/src/session.c b/src/session.c
index 28885c5..d4a00e7 100644
--- a/src/session.c
+++ b/src/session.c
@@ -463,6 +463,23 @@ libssh2_session_init_ex(LIBSSH2_ALLOC_FUNC((*my_alloc)),
     return session;
 }
 
+/* libssh2_session_init
+ * 
+ * Allocate and initialize a libssh2 session structure with default malloc
+ */
+LIBSSH2_API LIBSSH2_SESSION *
+libssh2_session_init(void)
+{
+    /* use temporary typedef to fix unsafe cast C ISO warnings */
+    typedef LIBSSH2_ALLOC_FUNC(libssh2_alloc_func_t);
+    typedef LIBSSH2_REALLOC_FUNC(libssh2_realloc_func_t);
+    typedef LIBSSH2_FREE_FUNC(libssh2_free_func_t);
+
+    return libssh2_session_init_ex((libssh2_alloc_func_t*)NULL, 
+                                   (libssh2_free_func_t*)NULL, 
+                                   (libssh2_realloc_func_t*)NULL, NULL);
+}
+
 /*
  * libssh2_session_callback_set
  *

