以下是我正在编写的程序的简化提取物。我在数组末尾访问元素时遇到问题。
#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。