【问题标题】:Dynamic C - char pointers, strcpy, strcat动态 C - 字符指针、strcpy、strcat
【发布时间】:2014-08-06 08:19:18
【问题描述】:

这是我的代码:

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。

问题是当我在传递给sendUDPLogPacket 之前打印log 的值时,它包含垃圾DynamiCUniversal Rabbit BIOS Version 9.50\?^>j。有人知道为什么这不起作用吗?

【问题讨论】:

  • memset() 填充已分配的内存。它分配内存。 log 指向一个随机位置,在您的情况下(幸运的是)该位置似乎不可写,因此您打印的是错误数据,而不仅仅是崩溃。

标签: c strcpy strcat char-pointer


【解决方案1】:

您的代码具有未定义的行为。

您不能像您一样有效地访问未初始化指针指向的内存。

memset() 函数写入内存,它不会神奇地分配新内存(它需要 input 指向要写入的内存的指针),无论如何你不能使用它“而不是" 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.

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-12-16
      • 2018-05-08
      • 2016-01-21
      • 2016-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-16
      • 2020-03-27
      相关资源
      最近更新 更多