gpt4 book ai didi

c++ - 正确分配的数组上出现段错误

转载 作者:行者123 更新时间:2023-11-30 21:15:19 24 4
gpt4 key购买 nike

在为在我看来正确分配的数组赋值时遇到段错误。下面是代码:

int SpV = L*L*L;
int V = SpV*T;
int M = 16;
int Ns = 2;
int Np = 10;

float *twopBuf = (float*) malloc(Np*Ns*V*M*2*sizeof(float));
if(twopBuf == NULL){
fprintf(stderr,"Cannot allocate twopBuf. Exiting\n");
exit(-1);
}

for(int bar=0;bar<Np;bar++)
for(int pr=0;pr<Ns;pr++)
for(int t=0;t<T;t++)
for(int v=0;v<SpV;v++)
for(int gm=0;gm<M;gm++){
int pos = 2*gm + 2*M*v + 2*M*SpV*t + 2*M*SpV*T*pr + 2*M*SpV*T*Ns*bar;

twopBuf[ 0 + pos ] = 1.0; // Set to 1.0 for
twopBuf[ 1 + pos ] = 1.0; // testing purposes
}

L 和 T 是输入,所以当说 L = 32 时和T = 64它运行良好。但对于L = 48T = 96我在 bar 之后出现段错误变为 2 之前变为 3。如果没有足够的内存来分配 twopBuf我不是已经收到错误消息了吗?

我正在大型 super 计算机的头节点上运行它,如果它有所作为的话。谢谢。

最佳答案

表达式

Np*Ns*V*M*2*sizeof(float)

评估为

((((Np*Ns)*V)*M)*2)*sizeof(float)

由于 C 和 C++ 中 * 的从左到右关联性。请参阅 C11 标准草案 n1570,6.5.5 乘法运算符

表达式 E1 * E2 的类型是操作数的常见实数类型(6.3.1.8 常用算术转换)。在本例中,类型为

((((int*int)*int)*int)*int)*size_t

因此,除了最后一个乘法之外,所有乘法都是在 int 精度和范围内完成的。对于 L = 48、T = 96 和 sizeof(float) == 4int 精度乘法的无限精确结果为 6794772480 ,它不能用 16 位或 32 位 int 表示,因此其中一个乘法必须在这样的实现上溢出,这是未定义的行为

如果表达式重新排序为:

sizeof(float)*Np*Ns*V*M*2

所有乘法均以 size_t 精度完成,除非 int 可以表示 size_t 可以表示的所有值。如果乘法以 size_t 精度完成,则即使发生溢出,乘法也是明确定义的,因为 size_t 是无符号的。但是,如果它确实溢出,malloc()将返回一个明显小于您预期的分配,如果您访问超出分配对象末尾的位置,这会导致未定义的行为.

对于您提供的数字,如果 size_t 的填充位少于 30 个,则 64 位 size_t 不会溢出。

关于c++ - 正确分配的数组上出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38765368/

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