2

我有以下代码:

#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

我得到一个分段错误。是什么赋予了?

4

3 回答 3

8

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

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

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

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

在实践中,您还应该检查该字符实际上是一个数字。

编辑:我不记得char *a = argv[1][1];在原始帖子中(也许早期编辑不会显示为编辑?),但任何理智的编译器都应该在该行给出编译时错误。整数不会隐式转换为 C 中的指针。如果编译器确实让它通过,那么包含原型atoi将不再有帮助,因为类型错误发生得更早。

于 2010-11-05T17:13:58.563 回答
8

这样编译?!

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

char *a = argv[1][1]将要

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

所以现在你将一个 char 分配给一个 char 指针(这应该是一个编译错误)。

我只能假设你的意思是char *a = &argv[1][1]。顺便说一句,常量正确性也会很好,所以const char *a = &argv[1][1].

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

于 2010-11-05T17:15:04.293 回答
2

atoi 接受一个字符串,而不是一个字符。

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

于 2010-11-05T17:19:35.013 回答