diff --git a/Common/GmshMessage.cpp b/Common/GmshMessage.cpp
index f9b256a32ca6c3be15847af349a0c9c2742c594f..28c1853d478c9449aed0e6fe9b9b54df07487ba3 100644
--- a/Common/GmshMessage.cpp
+++ b/Common/GmshMessage.cpp
@@ -77,18 +77,18 @@ static int vsnprintf(char *str, size_t size, const char *fmt, va_list ap)
 
 void Msg::Init(int argc, char **argv)
 {
-  int sargc = 0;
-  char **sargv = new char*[argc];
 #if defined(HAVE_MPI)
   int flag;
   MPI_Initialized(&flag);
-  if(!flag) MPI_Init(&sargc, &sargv);
+  if(!flag) MPI_Init(&argc, &argv);
   MPI_Comm_rank(MPI_COMM_WORLD, &_commRank);
   MPI_Comm_size(MPI_COMM_WORLD, &_commSize);
   MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_RETURN);
 #endif
 #if defined(HAVE_PETSC)
-  // prune argv from stuff that confuses PETSc
+  int sargc = 0;
+  char **sargv = new char*[argc + 1];
+  // prune argv from gmsh-specific options that make PETSc verbose
   for(int i = 0; i < argc; i++){
     std::string val(argv[i]);
     if(val != "-info" && val != "-help" && val != "-v")