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

将数组拆分为动态数组返回指针时触发SIGSEGV错误求助

问题排查与修复:数组拆分时的SIGSEGV错误

你的代码触发段错误的核心原因是指针运算符优先级误用,具体出现在splitData函数的循环赋值语句中:

*firstArray[i] = data[i];

C语言里,数组下标运算符[]的优先级比解引用运算符*更高,所以这行代码实际会被解析成*(firstArray[i])——你本来想访问*firstArray指向的动态数组的第i个元素,但现在变成了访问firstArray这个二级指针的第i个位置(而firstArray只是一个指向单个指针的地址,没有多余空间),直接导致越界访问,触发SIGSEGV错误。

修复后的代码

把循环里的赋值语句改成(*firstArray)[i]即可,先通过*firstArray拿到动态数组的首地址,再用[]访问对应下标:

#include <stdio.h>
#include <stdlib.h>

int splitData(int data[], int size, int splitPlace, int **firstArray);

int main() {

    int data[6] = {1, 2, 3, 4, 5, 6};
    int size = 6;
    int *ptr = NULL;
    int n = splitData(data, size, 3, &ptr);
    printf("%d\n", n);

    for(int i = 0; i < 3; ++i)
    {
        printf("[%d]", ptr[i]);
    }
    // 记得释放动态分配的内存,避免泄漏
    free(ptr);
    return 0;
}

int splitData(int data[], int size, int splitPlace, int **firstArray)
{
    // 检查splitPlace的合法性,防止非法分配
    if (splitPlace <= 0 || splitPlace > size) {
        return -1; // 返回错误码
    }
    *firstArray = (int *)malloc(splitPlace * sizeof(int));
    // 检查malloc是否成功
    if (*firstArray == NULL) {
        return -2; // 返回分配失败的错误码
    }

    for(int i = 0; i < splitPlace; ++i)
    {
        (*firstArray)[i] = data[i];
    }
    return 0;
}

额外建议

  • 永远要检查malloc的返回值,避免内存分配失败后继续操作空指针
  • 对splitPlace做合法性校验,防止传入负数或超过原数组长度的值,避免越界
  • 使用完动态分配的内存后,记得用free释放,避免内存泄漏

内容的提问来源于stack exchange,提问作者Kurbamit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:25:28