这是我的代码:
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。
问题是当我在传递给log
之前打印sendUDPLogPacket
的值时,它包含垃圾DynamiCUniversal Rabbit BIOS Version 9.50\?^>j
。任何人都有任何想法,为什么这不起作用?
答案 0 :(得分:2)
您的代码有未定义的行为。
您无法有效地访问未初始化指针所指向的内存,就像您一样。
memset()
函数写入内存,它不会神奇地分配新内存(它需要输入指向要写入的内存的指针),你无论如何都不能使用它& #34;而不是" 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.
答案 1 :(得分:0)
声明一个大小为func
+大小为msg
而不是未初始化的char指针的字符数组。