该代码有什么问题? (将 argv[] 复制到整数数组)

What's wrong with that code? (copying argv[] to array of ints)

    #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

此代码不是 C;它是 C++。您有两种选择:

  • 将代码编译为 C++,或者 ask/change 您的问题改为针对 C++ 受众。期待他们抱怨您使用 printf...
  • 将代码转换为C,这很容易。将 <cstdlib> 更改为 <stdlib.h>,将 <cstdio> 更改为 <stdio.h>,将 new int[argc] 更改为 malloc(argc * sizeof *stack);,将 delete stack; 更改为 free(stack);。 =40=]

无论您选择哪条路线,此代码都会调用未定义的行为;它访问 stack 越界,并使 stack 的第一个元素未初始化,我敢肯定这是不希望的。您可能打算在读取值之后和递增 stack 之前打印这些值,但是由于您弄错了,您正在打印数组中的下一个元素,当然您还没有分配...

然后最重要的是,你的循环修改了 stack 的值(毕竟这就是 ++stack 所做的),所以在你使用 delete 的循环之后您 deleteing 的引用不是使用 new 创建的...您需要确保保留 stack 的原始值,它得到 deleted , 或 freed, 或其他...

#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;
}

如果您使用数组索引而不是推进指针,您的代码会更清晰(和正确):

#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]