使用 memset 设置数组

Posted

技术标签:

【中文标题】使用 memset 设置数组【英文标题】:Using memset to set an array 【发布时间】:2012-07-17 18:50:52 【问题描述】:

我仍然是 C 的新手,但 memset 函数有问题。

我将一个 char * 传递给一个函数,并在该函数内部创建一个数组,然后使用 memset 设置每个值。我一直在使用 dbx 来观察这个变量,因为它进入函数,并且由于某种原因,在我们传递 memset 后它被设置为“”。

首先,为什么会发生这种情况?我假设 memset 必须重置 char * 所在的内存?

其次,有没有更好的方法将每个元素设置为“0”?

这是我的代码:

static char *writeMyStr(char *myStr, int wCount) 

   // here myStr is set to "My String is populated"  

   char **myArr;
   myArr = (char **) malloc(sizeof(char *) * wCount);
   memset(myArr, 0, sizeof(char *) * wCount);   // myStr is set to ""

   ... populate array ... 


【问题讨论】:

那些人都是白痴。 malloc 的返回值是一个 void *。如果不强制转换它,无论是隐式还是显式,你都无法对它做任何事情。 @CharlieMartin 这是 C,不是 C++。在 C++ 中,您需要强制转换。 @CharlieMartin:或许那些人只知道 C. @Blood:除非你需要调用malloc,因为例如你必须与C代码交互。 @Mystical 在 C 中,如果你不使用它,lint 会(正确地)抱怨。实际上,在 C 中,指针可能具有不同的大小,而未转换的赋值可能会丢失。 【参考方案1】:

您是在寻找零字符还是零数字?当这样初始化一个数组时:

memset(arr, 0, count);

相当于

memset(arr, '\0', count);

因为0=='\0'。字符串的长度是第一个空终止符的位置,因此您的字符串长度为零,因为支持它的数组用零填充。人们这样做的原因是,当他们向字符串添加内容时,他们不需要重新空终止它。

如果您希望字符串为“0000”...使用字符零:

memset(arr, '0', count);

但请记住以空值终止它:

arr[count-1] = '\0';

【讨论】:

【参考方案2】:

如果您最初尝试对数组进行零填充,最好使用 calloc 而不是 malloc。

所有 malloc 都会为您提供一个具有随机、不确定值的内存块。而 calloc 为您提供一块内存并将其填零,从而保证您不会在其中有垃圾。

【讨论】:

@CharlieMartin,如果有更好的方法将每个元素设置为零,这是试图回答他问题的第二部分。消除对 memset 的需求,并在确定清除 myStr 的确切内容方面留有更多余地。

以上是关于使用 memset 设置数组的主要内容,如果未能解决你的问题,请参考以下文章

Memset 将数组元素设置为 0

为啥memset不能将数组元素初始化为1?(急)

c语言中函数memset()是啥意思?啥功能

在 C++ 中将 memset 与多维数组一起使用

静态数组上的 memset

使用 memset 初始化包含数组的结构向量