微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决c语言中atoi编译错误的问题

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

我想我没有遗漏任何关于 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,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;
}

解决方法

有很多地方不对。

  1. 您无需先检查 argv[1] 就可以访问 argc,以了解 argv 中是否存储了任何参数
  2. double arith_seq(double* parr,int size,int com) 需要一个 double 指针作为第一个参数。您正在多个位置传递指向 double 指针的指针(例如,arith_seq(&in,num,0.1) in 的类型为 double*,您正在传递它的地址)
  3. double arith_seq(double* parr,int com) 需要 int 作为第三个参数,您在多个位置传递 double(例如 arith_seq(in,0.1),0.1 不是 int)。我认为您不想这样做。
  4. malloc 需要一个 size_t 参数,但您传递的是 (num + 1) * sizeof(double) .如果 (num + 1) 是负数怎么办?这将导致一些“有趣”的行为(例如考虑无符号值 -1 代表什么)。
  5. 您检查 malloc 是否返回了 NULL 指针 (in == NULL),但仍然继续调用 arith_seq,它访问 in 的元素。不允许取消引用 NULL 指针。
  6. 您将 in[num-1] 称为最后一个数组元素,但实际上 in[num] 是最后一个 elelement。请记住,您分配了一个 num+1 元素数组。
  7. 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,0.1);

    printf("My last array element is : %f",in[num]);

    free(in);
    return(0);
}

double arith_seq(double* parr,int com)
{
    for (int i = 1; i < size; i++)
    {
        parr[i] += parr[i-1] + com;
    }
    return *parr;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。