0

これが私のコードです:

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));
}

2 つの文字列を取り、それらを連結してから、新しい文字列とその長さを別の関数に渡すことになっています。関数をサポートしていないDynamic C 9.62を使用しているため、malloc代わりにmemsetを使用しています。

log問題は、 に渡される前に の値を printf するとsendUDPLogPacket、が含まれていることDynamiCUniversal Rabbit BIOS Version 9.50\?^>jです。なぜこれが機能しないのか、誰にもアイデアがありますか?

4

2 に答える 2

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.
于 2014-06-16T13:26:17.230 に答える
0

初期化されていない char ポインターの代わりに、サイズfunc+ size ofの char の配列を宣言します。msg

于 2014-06-16T13:30:59.310 に答える