2011-03-05 84 views
0

在GDB我得到:赛格故障(什么是错,strcpy的)

 
(gdb) backtrace 
0 0xb7d91544 in strcpy() from /lib/libc.so.6 
1 0x08048982 in ISBN::ISBN(char const*, ISBNPrefix&)() 
2 0x08048d4a in main() 
(gdb)

从这个代码:

ISBN::ISBN(const char* str, ISBNPrefix& list) { 
    if(isValid(str)) { 
      isSet = true; 
      sprintf(*isbnStr,"%s",str); 
    } 
} 

究竟会造成什么呢?

isbnStr在头创建:

class ISBN 
{ 
... 
    char* isbnStr[11]; 
... 

任何想法什么我可以做这里造成这种赛格故障?

呼叫在主要是:

ISBN* isbn = new ISBN("7999999008",*prefix); 
+1

根据维基百科,2007年及以后分配的ISBN有13位数字,而不是10个。 – 2011-03-05 03:41:04

+0

谢谢,该计划一次将处理100条记录,我还没有计划接受新的ISBN ,但很高兴知道我是否扩大了这一点。 – 2011-03-05 03:44:12

回答

8

isbnStr是一个字符串数组(或更具体字符指针),而不是字符数组。我认为你的意思是做char isbnStr[11];

+2

接下来,'sprintf(* isbnStr,“%s”,str);'应该是'strncpy(isbnStr,str,sizeof(isbnStr));' – rlibby 2011-03-05 03:32:25

+1

@rlibby:永远不要使用'strncpy'将最后一个字符设置为nul。 – Gabe 2011-03-05 04:36:50

+0

@加贝,谢谢。 – rlibby 2011-03-05 05:26:48

0

你在做什么初始化isbnStr?如果没有,它可能是一个无效的指针,这可能会导致您的程序崩溃。

0

您正试图将字符串在str(一char*)为isbnStr[0](一char*)复制,但在isbnStr是11 char*有效的一个阵列,这些char* s为初始化并指向垃圾地址。为isbnStr[0]isbnStr[10]分配内存。

注:我假设你的意思是让isbnStr是一个数组s,无论出于何种原因。如果您希望isbnStr为11个字符的数组,请将其声明为char isbnStr[11],并且不要在您的sprintf中对isbnStr解除引用。