我在一个我正在使用的库中有这段代码,我想知道它是做什么的,因为我遇到了内存问题,我想这就是原因。
所以这段代码如下:
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->a
和foo->a_size
都设置为0,或者此设置是否会阻止11到20 foo->a
中的0?
我试图自己运行此代码块并仅接收Segmentation fault
修改
问题是memset()
是否将foo->a
和foo->a_size
都设为0,或者是否在{{1}中将块从foo->a_size
设置为0
}}。后一个假设是正确的,但我还需要修复foo->a
,所以最后一个参数是memset()
。我还编辑了从10 * sizeof(struct items)
到foo->b
的变量名称。
答案 0 :(得分:6)
您正在使用10
(foo->a
)偏移量初始化pointer
(foo->b
)中的int
个字节。换句话说,你刚刚初始化了附加内存。
示例:强>
假设foo->a
为int*
并且指向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->b
到foo->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
的空间可能太小。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 是其中的偏移值。