C memset-优雅地添加一个空终止符

C memset-优雅地添加一个空终止符,c,malloc,memset,C,Malloc,Memset,在使用Cmemsetapi时,我添加了一个空终止符 代码起作用了;由于空终止符,我不再将奇数的内存中字符添加到malloc'd字符数组的末尾 /* memset does not add a null terminator */ static void yd_vanilla_stars(size_t *number_of_chars, char *chars_to_pad) { memset(chars_to_pad, 0, *number_of_chars+1); memset

在使用C
memset
api时,我添加了一个空终止符

代码起作用了;由于空终止符,我不再将奇数的内存中字符添加到malloc'd字符数组的末尾

/* memset does not add a null terminator */
static void yd_vanilla_stars(size_t *number_of_chars, char *chars_to_pad)
{
    memset(chars_to_pad, 0, *number_of_chars+1);
    memset(chars_to_pad,'*',*number_of_chars);
}

有没有更优雅的方法达到同样的效果?

你可以简单地做到:

memset(chars_to_pad, '*', *number_of_chars);
chars_to_pad[*number_of_chars] = '\0';

另外,为什么
number\u of \u chars
是指针?

这个问题表明
chars\u to \u pad
指向使用
malloc()分配的内存。另一种选择是使用。此函数自动将分配的内存归零初始化,因此无需在单独的步骤中将分配归零

示例可能如下所示:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
    size_t arr_sz = 11;
    char *arr = calloc(arr_sz, sizeof *arr);
    memset(arr, '*', arr_sz - 1);

    puts(arr);

    return 0;
}

如果您正在使用
malloc()
为数组分配,为什么不使用
calloc()
来获得零初始化分配?@DavidBowling.:是的,我想OP没有这么说;我不喜欢。谢谢@DavidBowling。Calloc更整洁。我可以删除此代码。请不要在问题中编辑解决方案。相反,您可以在答案框中发布答案,或者接受已发布的答案。我试图在代码中遵循一种通过引用传递的模式。您会为size\u t或int传递值吗?@rustyMagnet对于这样小的类型传递值应该不会更慢,而且肯定更可读。相关:(讨论C++中的const引用传递值VS;指针传递应该或多或少地像通过引用)。