【发布时间】:2013-04-20 14:49:15
【问题描述】:
此过程应将包含一组用逗号分隔的双精度数(例如 7.2、9.5、-5.515)的字符串转换为双精度类型的向量。
void ToDoubleVec(int d,const char* commaSeparated,double *result)
{
int i;
result[0]=atof(strtok(commaSeparated,","));
for(i=1;i<d;i++)
result[i]=atof(strtok(NULL,","));
}
这是调用它的程序的sn-p:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc,char** argv)
{
...
int i,dim=atoi(argv[1]);
double *lower;
lower = malloc(dim*sizeof(double));
ToDoubleVec(dim,argv[2],lower);
...
}
调试器的输出:
40 lower = malloc(dim*sizeof(double));
(gdb) s
42 ToDoubleVec(dim,argv[2],lower);
(gdb) s
ToDoubleVec (d=2, commaSeparated=0x7fffffffe9d3 "2.3,-62.1", result=0x603010) at testPSO.c:11
11 result[0]=atof(strtok(commaSeparated,","));
(gdb) s
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff77f56bb in ?? () from /lib/x86_64-linux-gnu/libc.so.6
为什么它不起作用?我确信我已经为数组分配了足够的内存,而且参数似乎也被正确传递了。
【问题讨论】:
-
@JohnKugelman 是的,看看调试器的输出:ToDoubleVec (d=2, commaSeparated=0x7ffffffffe9d3 "2.3,-62.1", result=0x603010)
-
commaSeparated应该声明为char *而不是const char *因为 strtok() 修改了它。你没有收到警告吗? -
勇敢的人将
strtok()的结果传递给atof()而不检查空指针...当strtok()返回null 时,我希望看到崩溃。 -
@JonathanLeffler 但如果您查看他传递给
ToDoubleVec的论点,我认为这不是他面临的问题。 -
出于调试目的,您最好将崩溃行更改为三行,这样您就可以将错误分配给所涉及的三个函数调用/分配之一。
标签: c segmentation-fault