代码之家  ›  专栏  ›  技术社区  ›  user8302192

malloc(5)=5个字符或5个字节?

  •  1
  • user8302192  · 技术社区  · 7 年前

    通过 malloc() 为字符串保留了5字节的空间。

    char *Function () {
        char *data;
        data = malloc(5);
        strcpy(data, "aaabb");
    
        return data;
    }
    

    aaabb 正如所料。

    char *test;
    test = Function();
    
    printf("%s", test);
    free(test);
    

    不改变 malloc(5) ..

    aaabbbccc

    打印 aaabbbccc公司

    malloc(5) 应该只保留5个字符的空间。不是9。

    data = malloc(5);
    

    问题2

    4 回复  |  直到 3 年前
        1
  •  9
  •   dbush    7 年前

    您为5个字节分配了空间(和一个 char 定义为1字节),但写入的字节数超过5字节。C不会阻止您在分配的内存或数组的边界之外进行写操作。如果你这样做,你调用 undefined behavior .

    printf 因为调试可以改变未定义行为本身的表现方式。

    关于您的具体示例,字符串 "aaabb" 实际上由6个字节组成:5个用于所讨论的字符,另一个用于表示字符串结束的空字节。所以对于这个字符串,你需要 malloc(6) "aaabbbccc" ,您需要分配10个字节,而不是9个字节。

        2
  •  6
  •   R.. GitHub STOP HELPING ICE    7 年前

    在C规范的语言中,字节和 char s是 因此,主题行中问题的答案是:两者都有。

    至于你的第二个问题,如果你试图在只有5个字节大小的分配空间中存储超过5个字节,那么你的程序的行为是未定义的。不要那样做。字符串 "aaabb" 大小为6个字节,因为C字符串以null结尾(第六个字节是null字符,值为0)。

        3
  •  0
  •   gbajson    7 年前

    来自man(3)malloc:

       malloc() allocates size bytes and returns a pointer to the allocated memory.  The memory is not cleared.  If size is 0, then malloc() returns
       either NULL, or a unique pointer value that can later be successfully passed to free().
    

    请记住,在C中,您可能会将更多字节写入分配给它的缓冲区。在这种情况下,您将覆盖一些内存,这可能会导致程序失败或更有趣的结果。

    AlephOne的优秀文章“为了乐趣和利润而粉碎堆栈”对此进行了很好的解释。 http://insecure.org/stf/smashstack.html

        4
  •  -1
  •   Malcolm McLean    7 年前