关于c语言atoi编译报错的问题
Question about compile error of atoi in c language
问题是无法编译带有“atoi”的行。如果我尝试调试我的代码,则会出现此语句“A5(动态内存分配).exe 中 0x7C17F2F6(ucrtbased.dll)处未处理的异常:将无效参数传递给认为无效参数致命的函数。”。 =11=]
我想我没有错过 atoi 部分的任何一件事。我正在使用 visual studio,这会是问题所在吗?要不要我改节目??
这是代码:
#include <stdio.h>
#include <stdlib.h>
double arith_seq(double*, int, int);
int main(int argc, char* argv[])
{
double* in;
int num;
num = atoi(argv[1]);
in = (double*)malloc((num+1) * sizeof(double));
if (in == NULL)
{
num = 1;
arith_seq(&in, num, 0.1);
}
//if there is no input
else
{
in[0] = 0;
arith_seq(&in, num, 0.1);
}
//in normal case
printf("My last array element is : %f", in[num - 1]);
//print the last element of the array
free(in);
return 0;
}
double arith_seq(double* parr, int size, int com)
{
for (int i = 1; i < size; i++)
{
parr[i] += parr[i - 1] + com;
}
return *parr;
}
有多处错误。
- 您访问
argv[1]
而没有首先检查 argc
以了解 argv
中是否存储了任何参数
double arith_seq(double* parr, int size, int com)
需要一个 double
指针作为第一个参数。您在多个位置传递指向 double
指针的指针(例如 arith_seq(&in, num, 0.1)
in
的类型为 double*
,您传递的是它的地址)
double arith_seq(double* parr, int size, int com)
期望 int
作为第三个参数,您在多个地方传递 double
(例如 arith_seq(in, num, 0.1)
,0.1 不是 int
).我认为你不想那样做。
malloc
需要一个 size_t
参数,但你传递的是 (num + 1) * sizeof(double)
.如果 (num + 1)
为负数怎么办?这将导致一些“有趣”的行为(例如,想想无符号值 -1 代表什么)。
- 您检查
malloc
是否返回了 NULL
指针 (in == NULL
),但仍然继续调用 arith_seq
,它访问 in
的元素.不允许取消引用 NULL
指针。
- 您将
in[num-1]
称为最后一个数组元素,但实际上 in[num]
是最后一个元素。请记住,您分配了一个包含 num+1
个元素的数组。
- 在
arith_seq
中你做 parr[i] += parr[i-1] + com
,等于 parr[i] = parr[i] + parr[i-1] + com
。但是 parr[i]
尚未在您的代码中的任何地方初始化并且包含垃圾数据。此垃圾数据在您的循环中传播到整个数组。
我建议使用该代码重新开始。
我不确定你打算用代码做什么,所以我不能完全修复它(这修复了 1 和 2,其余的我什至不知道你的初衷是什么),但至少不会崩溃:
#include <stdio.h>
#include <stdlib.h>
double arith_seq(double*, int, int);
int main(int argc, char* argv[])
{
double* in;
int num;
if(argc <= 1){
return(1);
}
num = atoi(argv[1]);
printf("%d\n", num);
in = (double*)malloc((num+1) * sizeof(double));
if (in == NULL)
{
return(1);
}
in[0] = 0.0f;
arith_seq(in, num, 0.1);
printf("My last array element is : %f", in[num]);
free(in);
return(0);
}
double arith_seq(double* parr, int size, int com)
{
for (int i = 1; i < size; i++)
{
parr[i] += parr[i-1] + com;
}
return *parr;
}
问题是无法编译带有“atoi”的行。如果我尝试调试我的代码,则会出现此语句“A5(动态内存分配).exe 中 0x7C17F2F6(ucrtbased.dll)处未处理的异常:将无效参数传递给认为无效参数致命的函数。”。 =11=]
我想我没有错过 atoi 部分的任何一件事。我正在使用 visual studio,这会是问题所在吗?要不要我改节目??
这是代码:
#include <stdio.h>
#include <stdlib.h>
double arith_seq(double*, int, int);
int main(int argc, char* argv[])
{
double* in;
int num;
num = atoi(argv[1]);
in = (double*)malloc((num+1) * sizeof(double));
if (in == NULL)
{
num = 1;
arith_seq(&in, num, 0.1);
}
//if there is no input
else
{
in[0] = 0;
arith_seq(&in, num, 0.1);
}
//in normal case
printf("My last array element is : %f", in[num - 1]);
//print the last element of the array
free(in);
return 0;
}
double arith_seq(double* parr, int size, int com)
{
for (int i = 1; i < size; i++)
{
parr[i] += parr[i - 1] + com;
}
return *parr;
}
有多处错误。
- 您访问
argv[1]
而没有首先检查argc
以了解argv
中是否存储了任何参数
double arith_seq(double* parr, int size, int com)
需要一个double
指针作为第一个参数。您在多个位置传递指向double
指针的指针(例如arith_seq(&in, num, 0.1)
in
的类型为double*
,您传递的是它的地址)double arith_seq(double* parr, int size, int com)
期望int
作为第三个参数,您在多个地方传递double
(例如arith_seq(in, num, 0.1)
,0.1 不是int
).我认为你不想那样做。malloc
需要一个size_t
参数,但你传递的是(num + 1) * sizeof(double)
.如果(num + 1)
为负数怎么办?这将导致一些“有趣”的行为(例如,想想无符号值 -1 代表什么)。- 您检查
malloc
是否返回了NULL
指针 (in == NULL
),但仍然继续调用arith_seq
,它访问in
的元素.不允许取消引用NULL
指针。 - 您将
in[num-1]
称为最后一个数组元素,但实际上in[num]
是最后一个元素。请记住,您分配了一个包含num+1
个元素的数组。 - 在
arith_seq
中你做parr[i] += parr[i-1] + com
,等于parr[i] = parr[i] + parr[i-1] + com
。但是parr[i]
尚未在您的代码中的任何地方初始化并且包含垃圾数据。此垃圾数据在您的循环中传播到整个数组。
我建议使用该代码重新开始。 我不确定你打算用代码做什么,所以我不能完全修复它(这修复了 1 和 2,其余的我什至不知道你的初衷是什么),但至少不会崩溃:
#include <stdio.h>
#include <stdlib.h>
double arith_seq(double*, int, int);
int main(int argc, char* argv[])
{
double* in;
int num;
if(argc <= 1){
return(1);
}
num = atoi(argv[1]);
printf("%d\n", num);
in = (double*)malloc((num+1) * sizeof(double));
if (in == NULL)
{
return(1);
}
in[0] = 0.0f;
arith_seq(in, num, 0.1);
printf("My last array element is : %f", in[num]);
free(in);
return(0);
}
double arith_seq(double* parr, int size, int com)
{
for (int i = 1; i < size; i++)
{
parr[i] += parr[i-1] + com;
}
return *parr;
}