使用二级指针分配杨辉三角内存时出现0xC00000FD错误求助
杨辉三角二级指针内存分配错误(错误码0xC00000FD)修复方案
核心错误分析
错误码0xC00000FD对应内存访问越界或栈溢出,你的代码存在两个致命问题:
- 内存分配逻辑完全混乱
somma函数逻辑错误:循环中修改了循环变量x,导致循环无法正常终止(比如输入x=3,循环里x会不断变化为3→3→2→0→-3...永远满足i<=x),直接触发栈溢出。- 二级指针分配方式错误:
int**类型的mat应该先分配n个指向每行的指针,再为每个指针分配对应行的元素空间(第i行需要i+1个int),而不是用错误计算出的sum去分配int*的数量。
- 野指针直接访问
stampa函数中直接对*(a+i)+j赋值,但a[i]是未初始化的野指针,访问它会触发内存访问错误。
修复后的完整代码
#include <stdio.h> #include <stdlib.h> // 计算杨辉三角总元素数:n*(n+1)/2 int get_total_elements(int n) { return n * (n + 1) / 2; } void print_pascal(int **a, int n) { // 初始化第一行 a[0][0] = 1; // 填充后续行 for (int i = 1; i < n; i++) { a[i][0] = 1; // 每行只需要填充到第i个元素(第i行共i+1个元素) for (int j = 1; j < i; j++) { a[i][j] = a[i-1][j-1] + a[i-1][j]; } a[i][i] = 1; } // 打印杨辉三角 for (int i = 0; i < n; i++) { for (int j = 0; j <= i; j++ ) { printf(" %3d", a[i][j]); } printf("\n"); } } int main() { int n, **mat = NULL; printf("输入行数n: "); scanf("%d", &n); // 第一步:分配n个int*指针,对应n行 mat = (int**)malloc(n * sizeof(int*)); if (mat == NULL) { perror("分配行指针失败"); return 1; } // 第二步:给每行分配对应数量的int空间 for (int i = 0; i < n; i++) { mat[i] = (int*)malloc((i + 1) * sizeof(int)); if (mat[i] == NULL) { perror("分配行元素失败"); // 回滚已分配内存,避免泄漏 for (int j = 0; j < i; j++) { free(mat[j]); } free(mat); return 1; } } print_pascal(mat, n); // 释放内存:先释放每行,再释放行指针数组 for (int i = 0; i < n; i++) { free(mat[i]); } free(mat); return 0; }
关键修复点说明
- 修正内存分配流程:二级指针
mat先存储n个行指针,再为每个行指针分配对应长度的内存,彻底避免野指针访问。 - 移除错误的
somma函数:用正确的数学公式计算总元素数,也可以用来做内存校验。 - 优化填充逻辑:填充杨辉三角时,每行只遍历到
j<i,最后一个元素直接设为1,减少无效循环。 - 添加内存释放与回滚:避免内存泄漏,分配失败时及时释放已分配的内存。
内容的提问来源于stack exchange,提问作者sim
相关产品推荐
相关产品推荐

