【问题标题】:How to use memset function in two dimensional array for initialization of members in C?如何在二维数组中使用 memset 函数来初始化 C 中的成员?
【发布时间】:2014-05-27 04:13:11
【问题描述】:

我想知道如何在 C 语言的 two dimensional array 中使用 memset() 函数。

我不想在该数组中遇到任何垃圾问题。如何初始化这个数组?

谁能解释我如何实现它?

【问题讨论】:

  • 答案取决于数组是使用栈内存还是堆内存定义的。
  • 无论是在栈上还是堆上,按照 Op 的要求使用 memset 并没有什么不同。
  • 当然,使用 memset 并不总是最好的方法。一种解决方案 - 如果正在使用 malloc(),请尝试 calloc()。
  • 如果您需要使用 memset 并希望帮助确定数组的大小,请发布一些代码来显示如何分配数组。
  • 这是我定义二维数组的初始化代码,我必须创建二维动态数组,为此,我以这种方式声明它。 int **矩阵; int **返回;

标签: c arrays memset


【解决方案1】:

如果您的二维数组具有静态存储持续时间,则默认初始化为零,即数组的所有成员都设置为零。

如果二维数组具有自动存储持续时间,则可以使用数组初始化器列表将所有成员设置为零。

int arr[10][20] = {0};  // easier way
// this does the same
memset(arr, 0, sizeof arr); 

如果您动态分配数组,则可以使用memset 将所有字节设置为零。

int *arr = malloc((10*20) * (sizeof *arr));
// check arr for NULL

// arr --> pointer to the buffer to be set to 0
// 0 --> value the bytes should be set to
// (10*20*) * (sizeof *arr) --> number of bytes to be set 
memset(arr, 0, (10*20*) * (sizeof *arr));

【讨论】:

  • 这里,终于 - 一个使用 memset 的答案。要使用 memset,请找到数组的起始地址(这很简单——它是数组变量的值,或者所有索引 = 0 的元素的地址,如果您希望更明确一些)。然后求数组的长度;这可能更棘手。一旦两者都知道,调用 memset。
【解决方案2】:

简单地说:

int array[10][10]={0};

它将所有数组成员初始化为 0。


C99 标准 6.7.8.21:

如果大括号括起来的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文字中的字符少于数组中的元素,则剩余的聚合应隐式初始化,与具有静态存储持续时间的对象相同。

【讨论】:

  • Op 专门要求 memset。
  • @ash:我不认为 OP 理解他/她需要什么的语义。在下一句中,他/她引用了预期的功能,这可以简单地使用上面来实现,没有需要memset。为了挑剔,OP 说“初始化”,在严格的技术意义上,使用memset 不会“初始化”任何东西,它只是将内存设置为0
  • 我明白你的意思。同时,memset 可以用来“初始化”一个空间——即设置它的初始值。无论如何,提出问题会澄清这一点。否则,答案确实需要针对所提出的问题。请记住,Op 可能在任何平台上使用任何年龄、任何年龄的 C 编译器中的任何一个......我并不是说这个答案在任何方面都是不好的——只是它没有回答这个问题“按要求”。
  • 我明白了。只是为了让您知道 - 如果我正在搜索 Op 要求的确切内容,即如何在多维数组上使用 memset,并找到您的答案,那么再多的声誉或年限也无济于事。很抱歉,您认为输入的声誉和时间优先于所有其他判断或有效输入。
  • @AlokSave as ash 告诉你,我得到了你的答案,因为我想 memset 一个二维数组,而不是初始化它。
【解决方案3】:

Alok Save 的答案是最好的,因为它适用于任何类型的数组。您也可以稍后重置数组,例如:

{
    T const blank[10][10] = { 0 };
    STATIC_ASSERT(sizeof blank == sizeof array);
    memcpy(&array, &blank, sizeof array);
}

这适用于所有类型。

如果你真的想使用memset,那么你可以这样做:

memset(&array, 0, sizeof array);

如果你只有一个指向数组第一个元素的指针,那么:

memset(ptr, 0, number_of_elements * sizeof *ptr);

但是,这些版本将所有字节设置为零,这可能不是浮点类型和指针类型的有效表示。

【讨论】:

    【解决方案4】:

    如果你有例如整数数组并想显式使用 memset:

    int array[M][N];
    

    您不需要在声明时使用 { 0 } 进行初始化。

    只是

    memset(array,0,M*N*sizeof (int));
    

    以上所有内容都是正确的,因为为了获得正确的 sizeof 数组,必须首先初始化数组。 并且数组在指针中衰减到一级。

    【讨论】:

      猜你喜欢
      • 2016-07-30
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      相关资源
      最近更新 更多