gpt4 book ai didi

c - 为什么 fopen() 会改变数组中元素的值?

转载 作者:行者123 更新时间:2023-11-30 18:58:59 25 4
gpt4 key购买 nike

int getbit(int * list, int n)
{
return (list[n / 32] >> (n % 32)) & 1;
}
void setbit(int * list, int n)
{
list[n / 32] |= 1 << (n % 32);
}
int main()
{
FILE * out;
int size = 99; //2000000000;
int root = sqrt(size);
int * list = malloc(size / 8.0); //(2*10^9)/8
memset(list, 0, sizeof list);
int i, j;
for (i = 2; i <= root; i++)
for (j = 2 * i; j < size; j += i)
setbit(list, j);
printf("i=%d j=%d 98=%d\n", i, j, getbit(list, 98));
out = fopen("output.txt", "w");
printf("i=%d j=%d 98=%d\n", i, j, getbit(list, 98));
/*for (i=2; i<size; i++)
if (!getbit(list, i))
fprintf(out, "%d\n", i);
fclose(out);*/
return 0;
}

每当我在 printf 之间使用 fopen() 时,第三个参数的值就会从 1 变为 0。如果我注释掉该行,则该值是相同的。这背后的原因可能是什么?

最佳答案

您会看到未定义的行为:sizeof(list) 可能是 4 或 8 个字节,具体取决于架构,因此带零的 memset 不会超过第四个字节。您正在读取第三个 32 位,该字来自 malloc,并且尚未由 memset 初始化。此外,您分配了 12 个字节(size/8.0 被转换为 int;传递 float 没有任何意义。 doublemalloc,因为您无法分配小数字节),因此访问第 98 位会超出分配的区域。

您应该修复这些未定义的行为:使用分配足够的内存

// count needs to be a multiple of sizeof(int)
// The math gets pretty ugly here, but it should work:
int count = sizeof(int)*(size+(8*sizeof(int))-1)/(8*sizeof(int));
int * list = malloc(count);

然后使用适当的大小将数据初始化为零:

memset(list, 0, count);

关于c - 为什么 fopen() 会改变数组中元素的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14203321/

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