为什么在这个程序中出现分段错误?
问题描述:
我试图在这个程序中将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
答
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)];
答
你混合getnumber
和getMandNvalues
。
您提供了getnumber
的原型,但没有定义该函数。在调用此函数之前,您提供了getMandNvalues
的定义,但没有原型。
在范围内调用没有原型的函数是合法的。编译器假定它返回int
并且所有参数都是int
。在这种情况下,这两种情况都不是这样。
正确的原型
答
您通过INT和INT C到一个期望的INT *和INT * C
而是采用
getMandNValues(argv[1], a, c);
功能,尝试
getMandNValues(argv[1], &a, &c);
我真的很希望你没有实际缩进(或者更确切地说n ot)你所有的代码... – 2010-11-06 16:03:53
有人应该对aString和bString的长度留言。 – 2010-11-06 16:10:26
aString和bString的大小在您的代码中将始终为4。它们不会是src字符串中传递的长度。 – 2010-11-06 16:13:59