C 为什么我在这个程序中遇到了分段错误?

C 为什么我在这个程序中遇到了分段错误?,c,pointers,string,command-line-arguments,C,Pointers,String,Command Line Arguments,我试图将这个程序中的m和N的值设置为从这个C程序在其命令行上接收的字符串中解析出来的值。然而,每当我运行代码时,就会出现分段错误。我对C语言中指针的概念还不太熟悉,所以我知道这是个问题 该代码的工作原理如下: /a.out-1,12 印刷品: 1,12 谢谢你的帮助 #include <stdio.h> #include <stdlib.h> void getnumber(char *toTest, int *a, int *c); i

我试图将这个程序中的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);
    }
应该是

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

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

例如,您应该将&a和&c传递给函数。

您应该将&a和&c传递给函数。

没有查看所有内容,但您需要此调用的变量地址

getMandNValues(argv[1], &a, &c);
我不知道您使用的是什么编译器,但我不会忽略它在编译时显示的警告。(如果您未使用最高级别的警告,则应。)


再看一看,还有另一个问题

while((aString[i] = &src[i+1]) != ',')
   ++i;
char aString[len(src)];
char bString[len(src)];
看起来很奇怪(而且是错误的)。我会这样做:

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

还有一个问题

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

没有查看所有内容,但您需要此呼叫的VAR地址

getMandNValues(argv[1], &a, &c);
我不知道您使用的是什么编译器,但我不会忽略它在编译时显示的警告。(如果您未使用最高级别的警告,则应。)


再看一看,还有另一个问题

while((aString[i] = &src[i+1]) != ',')
   ++i;
char aString[len(src)];
char bString[len(src)];
看起来很奇怪(而且是错误的)。我会这样做:

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

还有一个问题

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

您正在混合
getnumber
getMandNvalues

您已经为
getnumber
提供了一个原型,但没有该函数的定义。在调用此函数之前,您提供了
getMandNvalues
的定义,但没有原型

调用作用域中没有原型的函数是合法的。编译器假定它返回
int
,并且所有参数都是
int
。在这种情况下,这两种情况都不正确


更正您的原型

您正在混合
getnumber
getMandNvalues

您已经为
getnumber
提供了一个原型,但没有该函数的定义。在调用此函数之前,您提供了
getMandNvalues
的定义,但没有原型

调用作用域中没有原型的函数是合法的。编译器假定它返回
int
,并且所有参数都是
int
。在这种情况下,这两种情况都不正确


更正原型

将int a和int c传递给需要int*a和int*c的函数

而不是使用

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

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

将int a和int c传递给需要int*a和int*c的函数

而不是使用

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

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

我真的希望你不是真的像那样缩进(或者更确切地说不是)你所有的代码…有人应该留下一个关于aString和bString长度的评论。aString和bString的大小在你的代码中永远是4。它们不会是传入的src字符串的长度。调试器说segfault发生在哪里?@bk1e:我确定在作为指针传递的非指针上。segfault的意思是“非法指针”。我真的希望你没有像那样缩进(或者更确切地说不是)你所有的代码……应该有人对aString和bString的长度发表评论。aString和bString的大小在你的代码中永远是4。它们不会是传入的src字符串的长度。调试器说segfault发生在哪里?@bk1e:我确定在作为指针传递的非指针上。segfault表示“非法指针”。