C -SEG故障访问用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)[10000][100][100] = malloc(arraySize);
    for (int i = 0; i < 10000; i++) {
      for (int j = 0; j < 100; j++) {
            printf("%d, %d, %dn", i, j, scores[i][j][0][0]);
      }
    }
  }

程序循环通过4D数组得分,作为测试,我正在打印数组的内容。循环按计划开始,以" i j ,0"的格式打印为每个 i j 直到最后一个成功" 25、0、0"。
从这一点开始,我得到随机数而不是0,从" 25、1、1078528"开始,直到" 25、45、1241744152",然后是"分割故障(核心倾倒)"。

摆弄后,我发现第一个非零数组成员为得分[25] [0] [7] [64] 。。

所以我想我已经耗尽了空间,所以要访问我不应该的内存?如果有人知道或对如何解决这个问题有一个想法,我将非常感谢。

我的PC正在运行Ubuntu 16.10 64位,具有16GB RAM和16GB交换

编辑

实施以下建议后,我得到的返回值" calloc:不能分配内存"

int (*scores)[100][100][100] = calloc(arraySize, sizeof(int));
if (scores == NULL) {
  perror("calloc");
  return 1;
}

如果我评论了新的if语句(并运行for for循环),我会立即遇到seg错误。如果我使用malloc:

,也会发生这种情况
int (*scores)[100][100][100] = malloc(arraySize * sizeof(int));

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

  • 检查malloc()的返回值并确定是否无法分配。
  • 您忘了乘以int的大小。
  • result的类型应为int (*)[100][100][100],而不是int (*)[10000][100][100]
  • 使用通过malloc()分配的缓冲区的值,而不是初始化的Invokes 不确定的行为,所以不要这样做。

尝试以下操作:

#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, %dn", i, j, scores[i][j][0][0]);
      }
    }
}

您指向变量长度数组的指针不使用正确的数组大小。

数组是: [10000][100][100][100]

但指针是:[100][10000][100][100]

,您需要将数组尺寸乘以对象的大小,在这种情况下,在这种情况下

指针定义应为:

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

分配的元素未初始化。读取它们将产生不确定的值。


正确的类型是存储需要分配的字节大小,是size_t,而不是uint64_t。

分配数组的正确方法之一是:

const size_t bytes = sizeof( int[10000][100][100][100] );
int (*scores)[100][100][100] = malloc( bytes );

(这当然假设size_t可以表示该值。)

您是否尝试过:

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

bye。

最新更新