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

J. *_*ava 1 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);
Run Code Online (Sandbox Code Playgroud)

foo->a是类型struct items*,foo->a_size是类型int.

第一线的重新分配新的内存有10个街区,但现在我想知道,如果memset()设置都foo->afoo->a_size0或应该从11-20到0这一组块foo->a?我试图自己运行此代码块并仅接收Segmentation fault

编辑:

问题是,memset()设置是foo->afoo->a_size0还是设置块从偏移foo->a_size0in foo->a.后一个假设是正确的,但我还需要修复,memset()所以最后一个参数是10 * sizeof(struct items).我也是从编辑变量名foo->bfoo->a_size.

koc*_*ica 6

您正在使用()偏移初始化()10in foo->a(pointer).换句话说,您刚刚初始化了附加内存.foo->bint

例:

假设foo->aint*并指向5 int秒连续块.

+---+---+---+---+---+
| 0 | 0 | 0 | 0 | 0 |
+---+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)

您需要10 int秒,因此您将realloc阻止大小10*sizeof(int)字节,但附加5*sizeof(int)字节未初始化.

+---+---+---+---+---+---+---+---+---+---+
| 0 | 0 | 0 | 0 | 0 | ? | ? | ? | ? | ? |
+---+---+---+---+---+---+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)

所以通过做

memset(pointerToFirstByte + Offset, 0, 5 * sizeof(int));
Run Code Online (Sandbox Code Playgroud)

您将初始化这些附加的字节0.

+---+---+---+---+---+---+---+---+---+---+
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+---+---+---+---+---+---+---+---+---+---+
                      ^---^---^---^---^------ Initialized to 0
Run Code Online (Sandbox Code Playgroud)