C语言数组/指针动态分配咨询:代码正确性及内存分配方法
你的代码问题及修正方案
原代码的错误点
- 未分配有效内存:
int (*temp)[16000000];只是一个指向16000000个int的数组指针,但它没有指向任何实际分配的内存空间。直接解引用(*temp)[hashmap]++会访问非法内存,大概率导致程序崩溃。 - 逻辑判断错误:
if (temp[i] != NULL)完全不符合你的需求。temp是数组指针,不是指针数组,temp[i]会被解析为指向第i个16000000int数组的指针,这和你要检查槽位计数的逻辑无关;而且槽位存储的是int类型的计数,不能和指针常量NULL比较。
正确的动态分配与实现方式
你的需求是用16000000个int槽统计哈希次数,且初始值为0,最直接的方式是用calloc(或malloc+memset)动态分配一维数组:
1. 内存分配
推荐用calloc,它会自动将分配的内存初始化为0,正好满足你的初始化需求:
#include <stdio.h> #include <stdlib.h> int main() { const int SLOT_COUNT = 16000000; // 分配SLOT_COUNT个int的内存,自动初始化为0 int *temp = calloc(SLOT_COUNT, sizeof(int)); // 检查内存分配是否成功(必须做,否则内存不足时程序会出错) if (temp == NULL) { perror("calloc failed"); // 打印错误原因 return EXIT_FAILURE; }
如果用malloc,需要手动初始化内存为0:
#include <string.h> // ... int *temp = malloc(SLOT_COUNT * sizeof(int)); if (temp == NULL) { perror("malloc failed"); return EXIT_FAILURE; } // 将所有字节设为0,等价于把所有int初始化为0 memset(temp, 0, SLOT_COUNT * sizeof(int));
2. 统计哈希次数
直接用数组下标访问槽位,递增计数即可:
// 假设n是需要处理的元素数量,hashmap是每次计算出的槽位索引(范围0~SLOT_COUNT-1) int n = ...; // 你的元素数量 for (int i = 0; i < n; i++) { int hashmap = ...; // 这里写你的哈希计算逻辑,确保结果在0到15999999之间 temp[hashmap]++; }
3. 遍历槽位使用数据
判断槽位是否有计数,直接检查temp[i]是否大于0即可(因为初始是0):
for (int i = 0; i < SLOT_COUNT; i++) { if (temp[i] > 0) { // 这里处理有计数的槽位,比如打印或赋值 printf("槽位%d的计数:%d\n", i, temp[i]); // ... = temp[i]; } }
4. 释放内存
使用完动态分配的内存后,必须释放,避免内存泄漏:
free(temp); temp = NULL; // 将指针置空,防止后续误操作野指针 return 0; }
额外注意事项
- 哈希计算必须保证结果在
0到15999999之间,否则会出现数组越界访问,导致程序崩溃或数据损坏。 - 16000000个int大约占用64MB内存(每个int4字节),现代计算机都能轻松处理,不用担心内存不足,但仍要记得检查分配结果。
内容的提问来源于stack exchange,提问作者user20332975
相关产品推荐
相关产品推荐

