Что не так с этим кодом? (копирование argv [] в массив целых)

    #include <cstdlib>
#include <cstdio>

main( int argc, char **argv )
{
int *stack = new int[argc];
int it = 0;

while (--argc > 0 )
{
*(++stack) = atoi(*++argv);
printf( "%d \t %d \n", ++it, *stack );
}

delete stack;
return 0;
}

stack[3] должен содержать целочисленное значение из argv[3], но это не так.

Более того, я получаю сообщение об ошибке, связанное с оператором удаления munmap_chunk(): invalid pointer

-2

Решение

Этот код не C; это C ++. Для вас есть два варианта:

  • Скомпилируйте код как C ++ или задайте / измените свой вопрос, чтобы вместо этого ориентироваться на аудиторию C ++. Ожидайте, что они будут жаловаться на ваше использование printf
  • Преобразуйте код в C, что достаточно просто. + Изменить <cstdlib> в <stdlib.h>, <cstdio> в <stdio.h>, new int[argc] в malloc(argc * sizeof *stack); а также delete stack; в free(stack);,

Какой бы путь вы ни выбрали, этот код вызывает неопределенное поведение; это доступ stack за пределы одного и оставляет первый элемент stack неинициализированный, который, я уверен, не желателен. Вы, вероятно, хотели напечатать значения после их чтения и перед увеличением stack, но, поскольку вы ошиблись, вы печатаете следующий элемент в вашем массиве, который, конечно, еще не назначен …

Затем, в довершение всего, ваш цикл изменяет значение stack (это то что ++stack делает, в конце концов), так что после вашего цикла, когда вы используете delete Вы deleteиспользование ссылки, которая не была создана с помощью new… Вы должны убедиться, что вы сохраняете первоначальное значение stack, который получает deleteд или freeг, или как там …

#include <stdlib.h>
#include <stdio.h>

int
main( int argc, char **argv ) {
int *stack = malloc(argc * sizeof *stack);
int it = 0;
while (--argc > 0){
stack[it] = atoi(*++argv);
printf("%d \t %d \n", it, stack[it]);
it++;
}
free(stack);
return 0;
}
2

Другие решения

Ваш код был бы более понятным (и правильным), если бы вы использовали индексирование массивов вместо продвигающихся указателей:

#include <cstdlib>
#include <cstdio>

using namespace std;

main( int argc, char **argv )
{
int *stack = new int[argc];
for( int it = 1; it < argc; ++it )
{
stack[it] = atoi(argv[it]);
printf( "%d \t %d \n", it, stack[it] );
}

delete[] stack;
return 0;
}

Понятия не имею, почему вы хотите, чтобы неиспользованные stack[0], хоть.

0