2017-08-17 117 views
1

我在一个库中有这段代码,我在想它是什么,因为我有内存问题,我想这就是原因。memset(foo-> a + foo-> b,0,10)是什么意思?

所以一段代码以下:

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到0 foo->a这套块? 我试图依靠自己运行此代码块只接收Segmentation fault

编辑:

问题是,做的memset()同时设置foo->afoo->a_size为0或它与设定块偏移foo->a_size0 in foo->a。后面的假设是正确的,但我还需要修正memset(),所以最后一个参数是10 * sizeof(struct items)。我还编辑了从foo->bfoo->a_size的变量名称。

+3

不管结果,'foo-> A = realloc的(foo->一个,....'是一个相当坏习惯/编码风格。想象一下,realloc失败.......... –

+2

'foo-> a'是指向分配内存的指针,'foo-> b'是它的偏移量。可以写得更清晰,更安全! –

+0

他们真的叫'a'和'b',还是他们有意义的名字? – slim

回答

6

您与偏移foo->bint)初始化在foo->apointer10字节。换句话说,你只是初始化附加内存。

实施例:

让我们假设foo->aint*和指向5 int s的连续块。

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

需要10个int S,所以你会realloc,阻止大小10 * sizeof(int)字节,但追加5 * sizeof(int)字节是未初始化的。

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

这样做

memset(pointerToFirstByte + Offset, 0, 5 * sizeof(int)); 

你会初始化这些附加字节0

+---+---+---+---+---+---+---+---+---+---+ 
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 
+---+---+---+---+---+---+---+---+---+---+ 
         ^---^---^---^---^------ Initialized to 0 
+0

'foo_b'将是偏移量; 'foo-> a + foo-> b'将是一个指针 –

4

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

+1

这不是'foo-> b'的字节偏移量。由于指针算术,它是'foo-> b * sizeof(struct items)'的偏移量,不是吗?所以它会在该地址上设置10个字节。 –

+0

它是foo-> a的偏移量,而不是foo-> b,但是的确如此,它的结构大小将以字节为单位进行偏移 –

+0

那么它是否会改变结构11-20或结构21-30? –

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

这行设置的Foo->的10个字节的到。 foo-> a + foo-> b是其中的偏移值。

3

所以这两条线foo->a增加了10个地段struct items

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

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

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

这是不是可能就足够,因为它是不可能struct items的大小只有1个字节。你应该做的显然是这样的10手struct items

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

在代码片段的memsetfoo->a0新分配的部分初始化10个字节。此代码有多个问题:

  • 您不测试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; 
}