为什么在这个程序中出现分段错误?

问题描述:

我试图在这个程序中将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 
+2

我真的很希望你没有实际缩进(或者更确切地说n ot)你所有的代码... – 2010-11-06 16:03:53

+0

有人应该对aString和bString的长度留言。 – 2010-11-06 16:10:26

+0

aString和bString的大小在您的代码中将始终为4。它们不会是src字符串中传递的长度。 – 2010-11-06 16:13:59

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

应该

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

你应该通过&和& C到的功能,其中之一。

没有看任何事情,但你需要这次电话会议的地址。

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)]; 

你混合getnumbergetMandNvalues

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

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

正确的原型

您通过INT和INT C到一个期望的INT *和INT * C

而是采用

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

功能,尝试

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