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

Posted

技术标签:

【中文标题】c语言中atoi编译错误的问题【英文标题】:Question about compile error of atoi in c language 【发布时间】:2021-05-04 18:21:34 【问题描述】:

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

我想我没有错过 atoi 部分的任何一件事。我正在使用视觉工作室,这会是问题吗?要不要改程序??

这是代码:

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

【问题讨论】:

不要忽略编译器给你的警告 我认为代码中的atoi一定已经编译过了。在访问 argv 之前,请务必检查 argc 'arith_seq' 需要一个指向“double”的指针作为第一个参数,您正在传递一个指向“double”的指针。而不是传递“&in”,而是传递“in” 首先,在检查argc以确保argv中的元素有效之前,切勿使用``argv`的任何元素。 ⟼请记住,尤其是在 Stack Overflow 上学习和提问时,尽可能让代码保持井井有条是很重要的。 Consistent indentation 有助于传达结构,更重要的是,有助于传达意图,这有助于我们快速找到问题的根源,而无需花费大量时间尝试解码正在发生的事情。 【参考方案1】:

有很多地方出错了。

    您访问argv[1] 而不首先检查argc 以了解argv 中是否存储了任何参数 double arith_seq(double* parr, int size, int com) 期望 double 指针作为第一个参数。您正在多个位置传递指向 double 指针的指针(例如,arith_seq(&amp;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] 是最后一个el 元素。请记住,您分配了一个 num+1 elelements 数组。 在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;

【讨论】:

可以用in = malloc(sizeof *in * (num+1u));简化in = (double*)malloc((num+1) * sizeof(double));

以上是关于c语言中atoi编译错误的问题的主要内容,如果未能解决你的问题,请参考以下文章

为啥 stoi/atoi 会为我提供编译器错误?

C语言编译时的错误

C语言编译、连接的各种错误

c语言 编译错误

fluent编译UDF的过程中,出现了语法错误

一道c语言题,编译无错误,调试时出现“0x00403c2c 指令引用的 0x00000001 内存”,该内存不能为read。