2011-03-05 100 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解除引用。