diff --git a/.gitignore b/.gitignore
index 2a5312192232fb7be3719d9c2969e47cb63a7b82..834539af03b5e146db8e2388511ffc5bb6bdce04 100644
--- a/.gitignore
+++ b/.gitignore
@@ -116,3 +116,4 @@ tags
 # End of https://www.gitignore.io/api/c,vim,c++,linux,cmake
 
 mysh
+mysh-test
diff --git a/include/commands.h b/include/commands.h
index 7fbe4d9777458b930b91719f6bceeaff6156fa80..c0b66fecb66fd5863c4e9b9ab363c3a053eb37bc 100644
--- a/include/commands.h
+++ b/include/commands.h
@@ -7,8 +7,8 @@ struct single_command
   char** argv;
 };
 
-int evaluate_command(int n_commands, struct single_command (*commands)[]);
+int evaluate_command(int n_commands, struct single_command (*commands)[512]);
 
-void free_commands(int n_commands, struct single_command (*commands)[]);
+void free_commands(int n_commands, struct single_command (*commands)[512]);
 
 #endif // MYSH_COMMANDS_H_
diff --git a/include/utils.h b/include/utils.h
index 5f3403dd0226dca7e5f1b06d6b0193e2b1caf43d..54fa69fc192371bbfdc7579a4af7d457f7592fd8 100644
--- a/include/utils.h
+++ b/include/utils.h
@@ -5,7 +5,7 @@
 
 void mysh_parse_command(const char* command,
                         int* n_commands,
-                        struct single_command (*commands)[]);
+                        struct single_command (*commands)[512]);
 
 void parse_single_command(const char* command,
                           int *argc, char*** argv);
diff --git a/src/commands.c b/src/commands.c
index 2a4e6eccf7c1efd74825114ee6b2f08894d0fc96..13e9c330aedcb9d3c1c0979a5b22fd7844516ada 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -28,7 +28,7 @@ static int is_built_in_command(const char* command_name)
 /*
  * Description: Currently this function only handles single built_in commands. You should modify this structure to launch process and offer pipeline functionality.
  */
-int evaluate_command(int n_commands, struct single_command (*commands)[])
+int evaluate_command(int n_commands, struct single_command (*commands)[512])
 {
   if (n_commands > 0) {
     struct single_command* com = (*commands);
@@ -58,7 +58,7 @@ int evaluate_command(int n_commands, struct single_command (*commands)[])
   return 0;
 }
 
-void free_commands(int n_commands, struct single_command (*commands)[])
+void free_commands(int n_commands, struct single_command (*commands)[512])
 {
   for (int i = 0; i < n_commands; ++i) {
     struct single_command *com = (*commands) + i;
diff --git a/tests/src/command_parsing_test.cc b/tests/src/command_parsing_test.cc
index 6f943a1174cb34cb5c9d178ce0cd808123e2e857..3ba041d7731ea54b7c8416af2d946673b898ff95 100644
--- a/tests/src/command_parsing_test.cc
+++ b/tests/src/command_parsing_test.cc
@@ -1,102 +1,102 @@
+#ifdef __cplusplus
 extern "C" {
+#endif
 #include "utils.h"
+#include "commands.h"
+#ifdef __cplusplus
 }
+#endif
 
 #include "gtest/gtest.h"
 
 #include <stdlib.h>
 
-static void free_string_array(char*** argv, int num_str);
-
 TEST(CommandParsingTest, BasicCommand) {
-  char** argv = NULL;
-  int argc = -1;
+  struct single_command commands[512];
+  int n_commands = 0;
 
-  mysh_parse_command("cd test", &argc, &argv);
+  mysh_parse_command("cd test", &n_commands, &commands);
 
-  ASSERT_EQ(argc, 2);
-  EXPECT_STREQ(argv[0], "cd");
-  EXPECT_STREQ(argv[1], "test");
+  ASSERT_EQ(n_commands, 1);
+  ASSERT_EQ(commands[0].argc, 2);
+  EXPECT_STREQ(commands[0].argv[0], "cd");
+  EXPECT_STREQ(commands[0].argv[1], "test");
 
-  free_string_array(&argv, argc);
+  free_commands(n_commands, &commands);
 }
 
 TEST(CommandParsingTest, SingleCommand) {
-  char** argv = NULL;
-  int argc = -1;
+  struct single_command commands[512];
+  int n_commands = 0;
 
-  mysh_parse_command("pwd", &argc, &argv);
+  mysh_parse_command("pwd", &n_commands, &commands);
 
-  ASSERT_EQ(argc, 1);
-  EXPECT_STREQ(argv[0], "pwd");
+  ASSERT_EQ(n_commands, 1);
+  ASSERT_EQ(commands[0].argc, 1);
+  EXPECT_STREQ(commands[0].argv[0], "pwd");
 
-  free_string_array(&argv, argc);
+  free_commands(n_commands, &commands);
 }
 
 TEST(CommandParsingTest, Redirection1) {
-  char** argv = NULL;
-  int argc = -1;
+  struct single_command commands[512];
+  int n_commands = 0;
 
-  mysh_parse_command("pwd > curdir.txt", &argc, &argv);
+  mysh_parse_command("pwd > curdir.txt", &n_commands, &commands);
 
-  ASSERT_EQ(argc, 3);
-  EXPECT_STREQ(argv[0], "pwd");
-  EXPECT_STREQ(argv[1], ">");
-  EXPECT_STREQ(argv[2], "curdir.txt");
+  ASSERT_EQ(n_commands, 1);
+  ASSERT_EQ(commands[0].argc, 3);
+  EXPECT_STREQ(commands[0].argv[0], "pwd");
+  EXPECT_STREQ(commands[0].argv[1], ">");
+  EXPECT_STREQ(commands[0].argv[2], "curdir.txt");
 
-  free_string_array(&argv, argc);
+  free_commands(n_commands, &commands);
 }
 
 TEST(CommandParsingTest, Redirection2) {
-  char** argv = NULL;
-  int argc = -1;
+  struct single_command commands[512];
+  int n_commands = 0;
+
+  mysh_parse_command("pwd > curdir.txt | less", &n_commands, &commands);
 
-  mysh_parse_command("pwd > curdir.txt | less", &argc, &argv);
+  ASSERT_EQ(n_commands, 2);
+  ASSERT_EQ(commands[0].argc, 3);
+  EXPECT_STREQ(commands[0].argv[0], "pwd");
+  EXPECT_STREQ(commands[0].argv[1], ">");
+  EXPECT_STREQ(commands[0].argv[2], "curdir.txt");
 
-  ASSERT_EQ(argc, 5);
-  EXPECT_STREQ(argv[0], "pwd");
-  EXPECT_STREQ(argv[1], ">");
-  EXPECT_STREQ(argv[2], "curdir.txt");
-  EXPECT_STREQ(argv[3], "|");
-  EXPECT_STREQ(argv[4], "less");
+  ASSERT_EQ(commands[1].argc, 1);
+  EXPECT_STREQ(commands[1].argv[0], "less");
 
-  free_string_array(&argv, argc);
+  free_commands(n_commands, &commands);
 }
 
 TEST(CommandParsingTest, SpaceBeforeString) {
-  char** argv = NULL;
-  int argc = -1;
+  struct single_command commands[512];
+  int n_commands = 0;
 
-  mysh_parse_command("    \n  \t pwd > curdir.txt | less", &argc, &argv);
+  mysh_parse_command("    \n  \t pwd > curdir.txt | less", &n_commands, &commands);
 
-  ASSERT_EQ(argc, 5);
-  EXPECT_STREQ(argv[0], "pwd");
-  EXPECT_STREQ(argv[1], ">");
-  EXPECT_STREQ(argv[2], "curdir.txt");
-  EXPECT_STREQ(argv[3], "|");
-  EXPECT_STREQ(argv[4], "less");
+  ASSERT_EQ(n_commands, 2);
+  ASSERT_EQ(commands[0].argc, 3);
+  EXPECT_STREQ(commands[0].argv[0], "pwd");
+  EXPECT_STREQ(commands[0].argv[1], ">");
+  EXPECT_STREQ(commands[0].argv[2], "curdir.txt");
 
-  free_string_array(&argv, argc);
+  ASSERT_EQ(commands[1].argc, 1);
+  EXPECT_STREQ(commands[1].argv[0], "less");
+
+  free_commands(n_commands, &commands);
 }
 
 TEST(CommandParsingTest, EmptyCommand) {
-  char** argv = NULL;
-  int argc = -1;
-
-  mysh_parse_command("   \n \t    ", &argc, &argv);
-
-  ASSERT_EQ(argc, 1);
-  EXPECT_STREQ(argv[0], "");
-
-  free_string_array(&argv, argc);
-}
+  struct single_command commands[512];
+  int n_commands = 0;
 
-static void free_string_array(char*** argv, int num_str) {
-  for (int i = 0; i < num_str; ++i) {
-    free((*argv)[i]);
-  }
+  mysh_parse_command("   \n \t    ", &n_commands, &commands);
 
-  free(*argv);
+  ASSERT_EQ(commands[0].argc, 1);
+  EXPECT_STREQ(commands[0].argv[0], "");
 
-  *argv = NULL;
+  free_commands(n_commands, &commands);
 }
diff --git a/tests/src/command_validate_test.cc b/tests/src/command_validate_test.cc
index 527485478e31acc7cb80a3595af4d3a8f24acd3e..4da9bac54851bce6504d56658f6b1e0c00a9b713 100644
--- a/tests/src/command_validate_test.cc
+++ b/tests/src/command_validate_test.cc
@@ -1,5 +1,5 @@
 extern "C" {
-#include "commands.h"
+#include "built_in.h"
 }
 
 #include "gtest/gtest.h"