C 为什么我在这个程序中遇到了分段错误?
我试图将这个程序中的m和N的值设置为从这个C程序在其命令行上接收的字符串中解析出来的值。然而,每当我运行代码时,就会出现分段错误。我对C语言中指针的概念还不太熟悉,所以我知道这是个问题 该代码的工作原理如下: /a.out-1,12 印刷品: 1,12 谢谢你的帮助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
#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表示“非法指针”。