2015-05-31 3 views
-2
#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], но это не так.Что не так с этим кодом? (копирование argv [] в массив ints)

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

+0

'delete' не вещь в C. – juanchopanza

+0

' ++ stack' неверна. – BLUEPIXY

+1

Почему бы вам не упростить чтение кода с помощью простого, традиционного для цикла (например, 'for (int i = 0; i

ответ

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 uninitialised, который, я уверен, не будет желательным. Вероятно, вы должны были напечатать значения после их чтения и до приращения 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; 
} 
+0

Вы изменили логику цикла; в исходном 'stack [0]' не был назначен, а 'stack [1]' получил 'argv [1]' и т. д. В любом случае я бы предложил использовать 'it' вместо операторов инкремента и декремента –

+0

@MattMcNabb Well yeh, я изменил логику так, чтобы она не оставила 'stack [0]' uninitialised (как я уже упоминал в описании перед этим), и поэтому он не пытается получить доступ к «стеку» за пределами (также упоминалось ранее) ... и я получил принятый ответ, указав, что это изменение логики действительно исправило * что-то *. Проблема? – Sebivor

+0

Спасибо за отзыв от всех вас.Поскольку это будет функция ONP calc main(), на самом деле также следует читать и распознавать базовые операторы + - */ – makaku

0

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

#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

Спасибо, очень полезно. – makaku