无数组符号遍历二级指针出现段错误的原因及解决方法问询
问题分析与解决方案
段错误的根本原因
你的代码触发段错误完全是因为initNumSpace函数的内存分配逻辑错误:
- 在循环中,你直接给
int**类型的变量a、b、c赋值malloc返回的地址,这直接覆盖了它们原本指向A、B、C指针数组的地址。 - 最终导致
A、B、C指向的指针数组里的所有元素都是未初始化的野指针,当initNumbers函数尝试解引用*a、*b、*c时,自然触发段错误。
不使用数组符号遍历二级指针的正确方式
修正后的内存分配代码
void initNumSpace() { A = malloc(sizeof(int*) * 10); B = malloc(sizeof(int*) * 10); C = malloc(sizeof(int*) * 10); int** a = A; int** b = B; int** c = C; for (int i = 0; i < 10; i++) { // 给指针数组的当前元素分配一维数组内存,而非覆盖a本身的地址 *a = malloc(sizeof(int) * 10); *b = malloc(sizeof(int) * 10); *c = malloc(sizeof(int) * 10); a++; b++; c++; } }
正确的无数组符号遍历逻辑
你的initNumbers遍历逻辑本身是合理的,只要内存分配正确就能正常运行。如果要更简洁,可调整为:
void initNumbers() { int** a = A; int** b = B; int** c = C; for (int i = 0; i < 10; i++) { int* p = *a; int* q = *b; int* r = *c; for (int j = 0; j < 10; j++) { *r = rand() % 50; *p = rand() % 50; *q = rand() % 50; p++; q++; r++; } a++; b++; c++; } }
核心注意事项
- 明确二级指针的层级:
int**是指针数组的起始地址,*a是指针数组中的单个元素(指向一维数组的指针),**a是一维数组里的具体数值。 - 遍历指针数组时,用
a++移动到下一个数组元素;遍历一维数组时,用p++移动到下一个数值元素,全程无需使用下标[]。
内容的提问来源于stack exchange,提问作者user17949931
相关产品推荐
相关产品推荐

