该代码有什么问题? (将 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
的循环之后您 delete
ing 的引用不是使用 new
创建的...您需要确保保留 stack
的原始值,它得到 delete
d , 或 free
d, 或其他...
#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]
。
#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
的循环之后您 delete
ing 的引用不是使用 new
创建的...您需要确保保留 stack
的原始值,它得到 delete
d , 或 free
d, 或其他...
#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]
。