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

时间:2010-11-06 16:02:04

标签: 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);

    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

5 个答案:

答案 0 :(得分:3)

没有查看所有内容,但您需要此电话的变量地址。

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

答案 1 :(得分:2)

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

应该是

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

答案 2 :(得分:1)

你应该将&amp; a和&amp; c传递给该函数。

答案 3 :(得分:0)

您正在混合getnumbergetMandNvalues

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

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

纠正您的原型

答案 4 :(得分:0)

将int a和int c传递给期望int * a和int * c

的函数

而不是使用

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

,试试

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