Итак, я пишу программу на C для простой оболочки.Не слишком сложно, но я столкнулся с одной действительно странной проблемой, которую не могу объяснить.Я пытаюсь создать двумерный массив в структуре для представления команды и ее аргументов.Например, для команды "ls -l" я хотел бы иметь первый элемент "ls" и второй "-l".Кажется, работает нормально, кроме того, что malloc меняет "ls" на "ms".То же самое для других команд, первый символ увеличивается;не до malloc, а сразу после.
Это кусок кода, о котором идет речь ....
printf ("PRE MALLOC: %c\n", ret_val->args[0][0]);
printf ("[0] %p\n", ret_val->args[0]);
ret_val->args[1] = (char*) malloc ((3) * sizeof (char));
printf ("[0] %p\n", ret_val->args[0]);
printf ("[1] %p\n", ret_val->args[1]);
printf ("POST MALLOC: %c\n", ret_val->args[0][0]);
Все, что я пытаюсь сделать, это выделить 3 (-l+ нулевой) массив символов для хранения "-l" в аргументах [1].Они на самом деле тоже не будут жестко закодированы, но я подумал, что это поможет улучшить ситуацию.
Результат дал это ...
PRE MALLOC: l
[0] 80613b0
[0] 80613b0
[1] 80613b8
POST MALLOC: m
Так что два адреса не перекрываются или что-то странноено первый символ первого массива увеличивается?Извините, если я пропускаю что-то глупое.Но я не могу придумать причину, по которой это могло бы произойти.
Любые идеи?
Спасибо,
Вот гораздо больше кода для некоторого контекста.
int lcv;
int numargs;
int numchars;
int offset;
int bool;
TCommand* ret_val;
char** tmp;
ret_val = (TCommand*) malloc ( sizeof (TCommand) );
ret_val->cmd = NULL;
ret_val->args = NULL;
/* CMD */
lcv = 0;
numargs = 0;
numchars = 0;
offset = 0;
/* Remove initial whitespace */
while (input[offset] == ' ')
{
++offset;
}
lcv = offset;
/* Loop through command string */
while ( input[lcv] != ' ' && input[lcv] != 0 && input[lcv] != '&')
{
++numchars;
++lcv;
}
ret_val->cmd = (char*) malloc ( (numchars+1) * sizeof(char));
/* Copy to command string */
memcpy (ret_val->cmd, &(input[offset]), (numchars * sizeof (char)));
ret_val->cmd[numchars] = 0;
offset += numchars;
/* Copy command string into first argument */
ret_val->args = (char**) malloc ( sizeof (char*));
memcpy (ret_val->args[numargs++],ret_val->cmd, (numchars+1) * sizeof(char));
bool = 1;
while ( bool )
{
/* Remove initial whitespace */
while (input[offset] == ' ')
{
++offset;
}
lcv = offset;
if ( input[lcv] == 0 )
{
bool = 0;
}
else
{
++numargs;
tmp = (char**) realloc (ret_val->args, numargs * sizeof (char*));
ret_val->args = tmp;
numchars = 0;
while ( input[lcv] != ' ' && input[lcv] != 0 &&
input[lcv] != '&')
{
++numchars;
++lcv;
}
printf ("PRE MALLOC: %c\n", ret_val->args[0][0]);
printf ("[0] %p\n", ret_val->args[0]);
ret_val->args[1] = (char*) malloc ((2) * sizeof (char));
printf ("[0] %p\n", ret_val->args[0]);
printf ("[1] %p\n", ret_val->args[1]);
printf ("POST MALLOC: %c\n", ret_val->args[0][0]);
fflush(stdout);
memcpy (ret_val->args[numargs-1],&(input[offset]),numchars * sizeof (char));
ret_val->args[numargs-1][numchars] = 0;
offset += numchars;
}
}