C语言函数中访问修改字符串数组及ft_ultimate_range段错误问题
问题成因
你的代码段错误核心原因是运算符优先级误用:
C语言中,下标运算符[]的优先级高于解引用运算符*,你写的*range[j]会被编译器解析为*(range[j]),逻辑等价于先对二级指针range做偏移、再解引用,访问的是非法内存地址,因此触发段错误。
你实际的需求是:先对二级指针range解引用,拿到你malloc分配的int数组首地址,再访问下标为j的元素,所以正确写法是给解引用操作加括号调整优先级:
(*range)[j] = i;
去掉星号报错的原因
range[j]的类型是int*,直接给int*类型的变量赋值int类型的i,自然会触发类型不兼容的编译错误。
修正后的完整代码
#include <stdlib.h> int ft_ultimate_range(int **range, int min, int max) { int *arr; int i; int j; j = 0; i = min; if (min >= max) { *range = NULL; return 0; } int size = max - min; arr = malloc(sizeof(int) * size); if(arr == NULL) { *range = NULL; return -1; } *range = arr; while (i < max) { (*range)[j] = i; i++; j++; } return j; }
注:额外修正了
malloc失败时没有给*range赋值为NULL的边界问题,更符合题目要求。
数组在函数间传递的核心知识点
- 普通数组(如
int arr[])作为函数参数传递时,会自动退化为指向首元素的指针(类型为int*),所以函数内修改数组元素会直接修改外部原数组的内容。 - 如果需要在函数内部给外部的指针分配内存(比如本需求要在函数内执行
malloc),就需要传入指针的地址,也就是二级指针(int**),操作时先解引用拿到原指针,再操作对应内存即可。
内容的提问来源于stack exchange,提问作者MiguelP
相关产品推荐
相关产品推荐

