簡體   English   中英

為什么在此程序中出現分段錯誤?

[英]Why am I getting a segmentation fault in this program?

我正在嘗試將此程序中的M和N的值設置為從此C程序在其命令行上接收的字符串解析的任何值。 但是,每當我運行代碼時,我都會遇到分段錯誤。 我是C語言中的指針概念的新手,所以我知道它的存在。

該代碼應按以下方式工作:

./a.out -1,12

印刷品:

1、12

謝謝你的幫助!

    #include <stdio.h>
    #include <stdlib.h>

    void getnumber(char *toTest, int *a, int *c);

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

            int a, c, curr; 

            a = 1;
            c = 1;
            curr = 1;

            if ( argv[1][0] == '-' )
            {
                    curr = 2;
                    getMandNValues(argv[1], &a, &c);
            }

            printf("%d, %d\n", a, c);
            return 0;
    }


    void getMandNValues(char *src, int *a, int *c)
    {

            char aString[sizeof src];
            char bString[sizeof src];

            int i = 0;

            while((aString[i] = &src[i+1]) != ',')
                    ++i;

            aString[i] = '\0';

            int j = 0;

            while((bString[j] = &src[i + 2]) != '\0')
            {
                    ++j;
                    ++i;
            }

            bString[j] = '\0';

            *a = atoi(aString);
            *c = atoi(bString);
    }

編譯器輸出為:

/tmp/foo.c: In function ‘main’:
/tmp/foo.c:18: warning: passing argument 2 of ‘getMandNValues’ makes pointer from integer without a cast
/tmp/foo.c:18: warning: passing argument 3 of ‘getMandNValues’ makes pointer from integer without a cast
/tmp/foo.c: In function ‘getMandNValues’:
/tmp/foo.c:34: warning: assignment makes integer from pointer without a cast
/tmp/foo.c:41: warning: assignment makes integer from pointer without a cast

並沒有查看所有內容,但您需要此調用的var地址。

getMandNValues(argv[1], &a, &c);

我不知道您使用的是什么編譯器,但我不會忽略它在編譯時必須顯示的警告。 (如果未使用最高級別的警告,則應使用。)


看更多還有另一個問題

while((aString[i] = &src[i+1]) != ',')
   ++i;

似乎很奇怪(和錯誤)。 我會這樣做:

int index=0;
do
{
  aString[index] = src[index+1];
  index++;
} while (str[index] != ',')

這是另一個問題

char aString[len(src)];
char bString[len(src)];
getMandNValues(argv[1], a, c);

應該

getMandNValues(argv[1], &a, &c);

您應該將&a和&c傳遞給該函數。

您正在混合getnumbergetMandNvalues

您已經為getnumber提供了一個原型,但是沒有該函數的定義。 在調用此函數之前,您提供了getMandNvalues的定義,但沒有提供原型。

調用范圍內沒有原型的函數是合法的。 編譯器假定它返回int並且所有參數都是int 在這種情況下,這些都不是正確的。

更正您的原型

您將int a和int c傳遞給需要int * a和int * c的函數

而不是使用

getMandNValues(argv[1], a, c);

,嘗試

getMandNValues(argv[1], &a, &c);

暫無
暫無

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

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