2010-08-27 68 views
2

我試圖通過傳遞來定義在編譯時的路徑:使用strcpy時分段錯誤?

-DDCROOTDEF='"/path/to/stuff"' 

在編譯行。然後我試圖讓使用此代碼,如:

char * ptr_path; 
strcpy(ptr_path, DCROOTDEF); 
strcat(ptr_path,"/MainCommons/CommonLib/fonts/Arial.ttf"); 
char *pftf=ptr_path; 
gdImageStringFT(pimg,brect,iclr,pftf,pts,ang,ixp,iyp, (char *)cbuf); 

,給了我一個分段錯誤。但是,如果我嘗試首先打印字符串:

char * ptr_path; 
strcpy(ptr_path, DCROOTDEF); 
strcat(ptr_path,"/MainCommons/CommonLib/fonts/Arial.ttf"); 
char *pftf=ptr_path; 
printf("%s\n",pftf); 
gdImageStringFT(pimg,brect,iclr,pftf,pts,ang,ixp,iyp, (char *)cbuf); 

它工作得很好。字符指針是什麼錯綜複雜的我在這裏失蹤?

感謝

+0

如何在字符串的末尾添加'\ 0'? – karlphillip 2010-08-27 14:07:31

+1

@karlphillip:'\ 0'自動包含在字符串文字的末尾。 – 2010-08-27 14:10:41

+0

+1這是真的。 – karlphillip 2010-08-27 15:34:13

回答

3
char * ptr_path; 
strcpy(ptr_path, DCROOTDEF); 

你永遠不會初始化ptr_path

它在第二個代碼片段中不起作用,您剛剛變得不幸並且它出現工作。你仍然在使用一個未初始化的指針,並試圖寫入誰知道內存中的位置。

您需要初始化ptr_path指向長度至少爲strlen(DCROOTDEF) + 1的數組char。在將其內容複製到數組中之前,您還需要檢查DCROOTDEF的長度,以確保它不會太長。您可以使用strlen手動執行此操作,也可以使用長度檢查的複製功能,如strlcpy

+0

strlcpy是非標準的,不是嗎? – Nyan 2010-08-27 14:11:59

+0

@Nyan:'strlcpy'是非標準的。您可以輕鬆[在線查找實施](http://www.openbsd.org/cgi-bin/cvsweb/~checkout~/src/lib/libc/string/strlcpy.c?rev=1.11;content-type=文本/無格式)。 – 2010-08-27 14:19:41

+0

如果它看起來工作,那麼它的工作。未定義行爲的一個可能結果是您首先要做的行爲。可悲的是。 – 2010-08-27 14:35:24

1

指針ptr_path未初始化爲指向可寫內存,這就是爲什麼使用strcpy()對其進行解引用正在崩潰的原因。

您需要撥打malloc()以獲得空間,第一個:

char * ptr_path = malloc(PATH_MAX); 

或類似的東西。

+0

,你也需要''釋放()'內存。 – 2010-08-27 14:34:04

1

char * ptr_path; 
strcpy(ptr_path, DCROOTDEF); 
strcat(ptr_path,"/MainCommons/CommonLib/fonts/Arial.ttf"); 

指針不綁定的內存分配的合法塊,所以你的程序運行到未定義的行爲。首先需要分配緩衝區 - 例如,使用malloc()。確保緩衝區足夠大,以便將結果字符串與終止空字符一起保存。