gpt4 book ai didi

c - 为什么 memset init 部分?

转载 作者:太空狗 更新时间:2023-10-29 14:49:19 24 4
gpt4 key购买 nike

我正在尝试通过 memsetint **a 初始化为 0。但结果是某些项目不为零。
源代码

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

int main()
{
int aSize = 3;
int **a = (int **)malloc(sizeof(int *)*aSize);
for (int i=0; i<aSize; i++) {
a[i]=(int *)malloc(sizeof(int)*aSize);
}

memset(a[0], 0, aSize*aSize*sizeof(int));

for (int i=0; i<aSize; i++) {
for (int j=0; j<aSize; j++) {
printf("%d ", a[i][j]);
}
printf("\n");
}
}

输出

0 0 0 
0 0 0
0 1610612736 0

更新 1

我正在按照建议以两种方式尝试 malloc 连续。但是在方法2中初始化数组时抛出异常。

#include <stdio.h>
#include <stdlib.h>
#include <strings.h> // memset header changed
// method 1
int **a = malloc(sizeof(int *)*aSize);
for (int i=0; i<aSize; i++) {
a[i]=malloc(sizeof(int)*aSize);
memset(a[i], 0, aSize*sizeof(int));
}

for (int i=0; i<aSize; i++) {
for (int j=0; j<aSize; j++) {
printf("%d ", a[i][j]);
}
printf("\n");
}

for (int i=0; i<aSize; i++) {
free(a[i]);
}

free(a);

// method 2
a = malloc(sizeof(int *)*aSize + sizeof(int)*aSize);
memset(a[0], 0, aSize*aSize*sizeof(int)); // Exception: EXC_BAD_ACCESS (code=1, address=0x1c)

最佳答案

除非侥幸,否则这不可能奏效:

memset(a[0], 0, aSize*aSize*sizeof(int));

您已通过将指针 vector 分配给单独分配的行来模拟多维数组。但是在上面的表达式中,您假设内存是线性的(全部分配在一 block 中)。 memset写入超出 a[0] 的末尾行,导致未定义的行为。

正确的方法是遍历指针数组,并单独 memset每行:

for (i = 0; i < aSize; i++)
memset(a[i], 0, aSize * sizeof a[i]);

memset可以将操作提升到分配行的原始循环中;此外,calloc可以用来代替 malloc制作 memset不必要。 (C 语言要求全零位内存模式在解释为诸如 intdouble 等数字类型时产生零值,因此使用 calloc 将数字数组初始化为零是类型安全且可移植的。)

另外,没有<memory.h>标准 C 中的 header 。 malloc函数已在 <stdlib.h> 中声明自从 1989 年 C 首次标准化之前。

关于c - 为什么 memset init 部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58418938/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com