将数组拆分为动态数组返回指针时触发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
相关产品推荐
相关产品推荐

