You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 04:39:02