簡體   English   中英

為什么atoi給我帶來細分錯誤?

[英]Why is atoi giving me a segmentation fault?

我有以下代碼:

#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

我遇到了細分錯誤。 是什么賦予了?

#include <stdlib.h> ,它應該很明顯。

詳細說明:您正在將整數傳遞給需要指針的函數,並且編譯器無法警告您,因為您忘記了使用原型聲明函數。 這是崩潰的原因。

而且,您只是在濫用atoi atoi解析字符串 ,而不是單個字符。 如果要將字符的值表示為數字,只需減去'0'

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

在實踐中,您還應該檢查字符是否確實是數字。

編輯:我不記得char *a = argv[1][1]; 在原始帖子中(也許早期的編輯不會顯示為編輯?),但是任何明智的編譯器都應在該行上給出編譯時錯誤。 整數不會在C中隱式轉換為指針。如果編譯器確實允許這樣做,那么包含atoi的原型將不再有幫助,因為類型錯誤較早發生。

編譯嗎?

char argv * []是char指針的數組。

char *a = argv[1][1]

  • 獲取第二個char指針,所以現在有了char *
  • 獲取該指針中的第二個元素,它將是一個char。

因此,現在您將一個char分配給char指針(應該是編譯錯誤)。

我只能假設您要說char *a = &argv[1][1] 順便說一句,const正確性也很好,所以const char *a = &argv[1][1]

順便說一句,您的代碼仍然非常不安全-您甚至都不檢查字符串的大小。 想象一下&argv[1][3]如果您的字符串只有兩個字符, &argv[1][3]做什么。

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

另外,atoi總體上也不是很好,因為它基本上沒有錯誤報告。 大多數情況下,您應該調查strtol。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM