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

它应该采用两个字符串,将它们连接在一起,然后将新字符串及其长度传递给不同的函数。我使用的是 Dynamic C 9.62,它不支持该malloc功能,所以我使用 memset 代替。

问题是当我 printf 的值log之前它被传递给它时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

func声明一个大小为+ 大小的字符数组,msg而不是一个未初始化的字符指针。

于 2014-06-16T13:30:59.310 回答