memset(foo-> a + foo-> b,0,10)是什么意思?

时间:2017-08-17 10:55:10

标签: c pointers

我在一个我正在使用的库中有这段代码,我想知道它是做什么的,因为我遇到了内存问题,我想这就是原因。

所以这段代码如下:

    int new_size = foo->a_size + 10;
    foo->a = realloc(foo->a, new_size*sizeof(struct items));
    memset(foo->a+foo->a_size, 0, 10);

foo->a类型为struct items*foo->a_size类型为int

第一行重新分配了10个新内存块,但现在我想知道memset()是否将foo->afoo->a_size都设置为0,或者此设置是否会阻止11到20 foo->a中的0? 我试图自己运行此代码块并仅接收Segmentation fault

修改

问题是memset()是否将foo->afoo->a_size都设为0,或者是否在{{1}中将块从foo->a_size设置为0 }}。后一个假设是正确的,但我还需要修复foo->a,所以最后一个参数是memset()。我还编辑了从10 * sizeof(struct items)foo->b的变量名称。

5 个答案:

答案 0 :(得分:6)

您正在使用10foo->a)偏移量初始化pointerfoo->b)中的int个字节。换句话说,你刚刚初始化了附加内存。

示例:

假设foo->aint*并且指向5 int个连续阻止。

+---+---+---+---+---+
| 0 | 0 | 0 | 0 | 0 |
+---+---+---+---+---+

您需要10 int秒,因此realloc会阻止10 * sizeof(int)字节,但附加5 * {{1}字节未初始化。

sizeof(int)

通过做

+---+---+---+---+---+---+---+---+---+---+
| 0 | 0 | 0 | 0 | 0 | ? | ? | ? | ? | ? |
+---+---+---+---+---+---+---+---+---+---+

您将这些附加字节初始化为memset(pointerToFirstByte + Offset, 0, 5 * sizeof(int));

0

答案 1 :(得分:4)

有问题的行设置10个字节,从foo->bfoo->a的偏移量开始为0.偏移量是结构项的大小。我们没有足够的信息来进一步解释这一点,但我猜测foo-> a是指向动态分配的结构数组的指针,这里我们设置部分字段(可能是一个元素?)到0。

答案 2 :(得分:3)

因此,这两行将foo->a增加了10批struct items

int new_size = foo->b + 10;
foo->a = realloc(foo->a, new_size*sizeof(struct items));

这将foo->a的10个字节的内存设置为foo->b * sizeof(struct items)到0

memset(foo->a+foo->b, 0, 10);

这可能不够,因为struct items不太可能只有1个字节。您应该做的事情显然是10批这样的struct items

memset(foo->a+foo->b, 0, 10*sizeof(struct items));

答案 3 :(得分:1)

代码片段中的memset将新分配的foo->a部分中的10个字节初始化为0。此代码中存在多个问题:

  • 您不会测试realloc()失败。
  • 您使用foo->a的返回值覆盖realloc()。如果realloc()失败,foo->a先前指向的块仍然被分配但可能无法访问,内存泄漏。
  • 设置为0的空间可能太小。
  • 初始化为所有位0可能不适合结构items
  • 您不会更新foo->size

以下是改进版本:

size_t new_size = foo->a_size + 10;
struct items *newp = realloc(foo->a, new_size * sizeof(*foo->a));
if (newp == NULL) {
    // handle the error
} else {
    memset(newp + foo->a_size, 0, (new_size - foo->a_size) * sizeof(*foo->a));
    foo->a = newp;
    foo->a_size = new_size;
}

答案 4 :(得分:-1)

memset(foo->a+foo->b, 0, 10);

此行将 Foo-> a 的10个字节设置为 0 foo-> a + foo-> b 是其中的偏移值。