为什么atoi给我一个分段错误?

时间:2010-11-05 17:13:13

标签: c segmentation-fault atoi

我有以下代码:

#include <stdio.h>

int main ( int argc, char *argv[] )
{
    int M, N;

    M = 1;
    N = 1;
    curr = 1;

    if ( argv[1][0] == '-' )
    {
        curr = 2;

        char *a = argv[1][1];
        char *b = argv[1][3];

        M = atoi(a);
        N = atoi(b);
    }

    printf("%d\n%d", M, N);
}

所以,我通过这个程序:

a.out -1,2

而不是获得预期的输出

  

1
  2

我遇到了分段错误。是什么给了什么?

3 个答案:

答案 0 :(得分:8)

#include <stdlib.h>它应该变得明显。

详细说明:您将一个整数传递给需要指针的函数,编译器无法警告您,因为您忘记使用原型声明该函数。这是事故的原因。

此外,你只是在滥用atoiatoi解析字符串,而不是单个字符。如果您希望将字符的值作为数字,只需减去'0'

M = argv[1][1]-'0';
N = argv[1][3]-'0';

在实践中,你还应该检查角色是否真的是一个数字。

编辑:我不记得char *a = argv[1][1];在原帖中(可能早期编辑没有显示为编辑?),但任何理智的编译器都应该编译 - 该行的时间错误。整数不会隐式转换为C中的指针。如果编译器确实允许这样做,那么包含atoi的原型将不再有用,因为类型错误发生得更早。

答案 1 :(得分:8)

编译?!

char argv * []是一个char指针数组。

char *a = argv[1][1]

  • 获取第二个字符指针,现在您有一个char *
  • 获取该指针中的第二个元素,这将是一个字符。

所以现在你要为char指针指定一个char(这应该是一个编译错误)。

我只能假设你想说char *a = &argv[1][1]。顺便说一句,const-correctness也不错,所以const char *a = &argv[1][1]

顺便说一下,你的代码仍然非常不安全 - 你甚至不检查字符串的大小。想象一下,如果你的字符串只有两个字符,&argv[1][3]会做什么。

答案 2 :(得分:2)

atoi需要一个字符串,而不是一个字符。

此外,atoi一般不好,因为它基本上没有错误报告。你应该在大多数情况下调查strtol。

相关问题