我在一个我正在使用的库中有这段代码,我想知道它是做什么的,因为我遇到了内存问题,我想这就是原因.
所以这段代码如下:
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->a和foo->a_size0或应该从11-20到0这一组块foo->a?我试图自己运行此代码块并仅接收Segmentation fault
编辑:
问题是,memset()设置是foo->a和foo->a_size0还是设置块从偏移foo->a_size到0in foo->a.后一个假设是正确的,但我还需要修复,memset()所以最后一个参数是10 * sizeof(struct items).我也是从编辑变量名foo->b来foo->a_size.
您正在使用()偏移初始化()10in foo->a(pointer).换句话说,您刚刚初始化了附加内存.foo->bint
例:
假设foo->a是int*并指向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)
| 归档时间: |
|
| 查看次数: |
193 次 |
| 最近记录: |