2014-06-16 80 views
0

這裏是我的代碼:的Dynamic C - 字符指針,strcpy的,strcat的

nodebug void sendLogPacketS(char *func, char *msg) 
{ 
    char * log; 
    memset(log, 0, strlen(func) + strlen(msg) + 1); 
    strcpy(log, func); 
    strcat(log, ": "); 
    strcat(log, msg); 
    sendUDPLogPacket(log, strlen(log)); 
} 

它應該採取兩個字符串,拼接在一起,然後通過新的字符串,其長度不同的功能。我使用Dynamic C 9.62,它不支持malloc函數,所以我使用memset代替。

問題是我在printf的值log傳遞到sendUDPLogPacket之前,它包含垃圾DynamiCUniversal Rabbit BIOS Version 9.50\?^>j。任何人有任何想法,爲什麼這不起作用?

+2

'memset()'填充已分配的內存。它不*分配內存。 'log'指向一個隨機的位置(幸運的是)在你的情況下似乎不是可寫的,所以你打印錯誤的數據而不是崩潰。 –

回答

2

您的代碼有未定義的行爲。

您不能有效地訪問未初始化指針所指向的內存,就像您一樣。

memset()函數寫入內存,它不會奇蹟般地分配新的內存(它需要爲輸入寫入指針到內存),你可以不使用反正「而不是」它malloc()

您可以用堆棧上緩衝嘗試:

char log[128] = ""; 
當然

需要照顧不要使用超過128個字符;你無界的strcat()使用是危險的。

如果你的劉海編譯器支持C99當然你也可以這樣做:

const size_t flen = strlen(func); 
const size_t mlen = strlen(msg); 
char log[flen + 2 + mlen + 1]; // Space for func, msg, colon, space, terminator. 
0

聲明字符數組與func +尺寸的msg,而不是一個初始化字符指針的大小。