关于c语言中atoi编译错误的问题

关于c语言中atoi编译错误的问题,c,atoi,C,Atoi,问题是不能编译带有“atoi”的行。如果我尝试调试代码,则会出现以下语句:“A5(动态内存分配).exe中0x7C17F2F6(ucrtbased.dll)处未处理的异常:将无效参数传递给认为无效参数致命的函数。” 我想我没有错过atoi部分的任何一件事。我正在使用visual studio,这会是问题所在吗?我要改变节目吗 代码如下: #include <stdio.h> #include <stdlib.h> double arith_seq(double*, in

问题是不能编译带有“atoi”的行。如果我尝试调试代码,则会出现以下语句:“A5(动态内存分配).exe中0x7C17F2F6(ucrtbased.dll)处未处理的异常:将无效参数传递给认为无效参数致命的函数。”

我想我没有错过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;
}
#包括
#包括
双算术顺序(双*,整数,整数);
int main(int argc,char*argv[])
{
双*英寸;
int-num;
num=atoi(argv[1]);
in=(双*)malloc((num+1)*sizeof(双));
if(in==NULL)
{
num=1;
arith_-seq(&in,num,0.1);
}
//如果没有输入
其他的
{
in[0]=0;
arith_-seq(&in,num,0.1);
}
//在正常情况下
printf(“我的最后一个数组元素是:%f”,在[num-1]中);
//打印数组的最后一个元素
免费(in);
返回0;
}
双算术顺序(双*parr,整数大小,整数com)
{
对于(int i=1;i
有很多地方出了问题

  • 您可以访问
    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\u t
    参数,但您正在传递
    (num+1)*sizeof(double)
    . 如果
    (num+1)
    为负怎么办?这将导致一些“有趣的”行为(例如,想想无符号值-1代表什么)
  • 您检查
    malloc
    是否返回了
    NULL
    指针(
    in==NULL
    ),但仍然继续调用
    arith_seq
    ,它访问
    的元素。不允许取消引用
    NULL
    指针
  • 您将[num-1]中的
    称为最后一个数组元素,但实际上[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;
    }
    
    #包括
    #包括
    双算术顺序(双*,整数,整数);
    int main(int argc,char*argv[])
    {
    双*英寸;
    int-num;
    
    如果(argc不要忽略编译器给你的警告,我想代码中的
    atoi
    一定已经编译好了。在访问
    argv
    之前,一定要检查
    argc
    “arith\u seq”需要指向“double”的指针作为第一个参数,你传递的是指向“double”的指针。首先,不是传递“&in”,而是传递“in”,n在检查
    argc
    以确保
    argv
    中的元素有效之前,请务必使用``argv`的任何元素。⟼请记住,让代码尽可能有条理是非常重要的,特别是在学习和询问堆栈溢出问题时。有助于沟通结构,更重要的是,有助于我们快速找到问题的根源,而无需花费大量时间试图解码。可以简化
    in=(double*)malloc((num+1)*sizeof(double));
    with
    in=malloc(sizeof*in*(num+1u));