gpt4 book ai didi

c - 访问使用 malloc 初始化的数组时出现段错误

转载 作者:太空宇宙 更新时间:2023-11-04 03:24:12 27 4
gpt4 key购买 nike

下面是我正在编写的程序的简化摘录。我在访问数组末尾的元素时遇到问题。

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

int main(int n, char *args[n]){

// create 4D array scores[10000][100][100][100] on heap

uint64_t arraySize = 1; // this avoids overflow
arraySize *= 10000;
arraySize *= 100;
arraySize *= 100;
arraySize *= 100;

int (*scores)[10000][100][100] = malloc(arraySize);

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

程序循环遍历 4D 数组 score 并且作为测试,我正在打印数组的内容。循环按计划开始,以格式“i, j, 0”打印每个 ij,直到最后成功“25,0,0”。
从这一点开始,我得到随机数而不是 0,从“25、1、1078528”开始直到“25、45、1241744152”,然后是“段错误(核心已转储)”。

经过一番摸索,我发现第一个非零数组成员是scores[25][0][7][64]

所以我想我的空间用完了,所以我访问了我不应该访问的内存?如果有人知道或知道我该如何解决这个问题,我将不胜感激。

我的电脑运行的是 Ubuntu 16.10 64 位,有 16GB RAM 和 16GB swap

编辑

在执行了以下建议后,我得到了 “calloc:无法分配内存” 的返回值。

int (*scores)[100][100][100] = calloc(arraySize, sizeof(int));

if (scores == NULL) {
perror("calloc");
return 1;
}

如果我注释掉新的 if 语句(并运行 for 循环),我会立即遇到段错误。如果我使用 malloc,也会发生这种情况:

int (*scores)[100][100][100] = malloc(arraySize * sizeof(int));

为什么会这样?我的系统肯定有足够的内存
干杯

最佳答案

  • 检查malloc()的返回值,判断是否分配失败。
  • 您忘记乘以 int 的大小。
  • result的类型应该是int (*)[100][100][100],而不是int (*)[10000][100 ][100].
  • 使用通过 malloc() 分配但未初始化的缓冲区值会调用未定义的行为,所以不要这样做。

试试这个:

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

int main(int n, char *args[n]){

// create 4D array scores[10000][100][100][100] on heap

uint64_t arraySize = 1; // this avoids overflow
arraySize *= 10000;
arraySize *= 100;
arraySize *= 100;
arraySize *= 100;

int (*scores)[100][100][100] = calloc(arraySize, sizeof(int));

if (scores == NULL) {
perror("calloc");
return 1;
}

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

关于c - 访问使用 malloc 初始化的数组时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42594688/

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