如何通过函数参数创建并返回动态数组?遇段错误求助
问题分析与解决方法
段错误原因
函数createArray的参数int *ptr是值传递,你在函数内给ptr分配内存,修改的只是函数内部的局部变量副本,并不会改变main函数里array的指向。main里的array始终是NULL,后续访问array[i]必然触发段错误(SIGSEGV)——因为你在访问空指针指向的非法内存。
修复方案
方案一:使用指针的指针(传递指针的地址)
通过传递指针的地址,让函数能直接修改外部指针的指向:
#include <stdio.h> #include <stdlib.h> void createArray(int **ptr, int n) { *ptr = malloc(n * sizeof(int)); // 检查内存分配是否成功,避免后续错误 if (*ptr == NULL) { perror("malloc failed"); exit(EXIT_FAILURE); } for(int i = 1; i <= n; ++i) { (*ptr)[i-1] = i*i; // 下标写法更直观 } } int main() { int *array = NULL; int n = 5; createArray(&array, n); for(int i = 0; i < n; ++i) { printf("%d ", array[i]); } free(array); // 释放动态内存,避免泄漏 return 0; }
方案二:让函数返回动态分配的指针
这种写法更直观,直接将malloc后的指针返回给调用者:
#include <stdio.h> #include <stdlib.h> int* createArray(int n) { int *ptr = malloc(n * sizeof(int)); if (ptr == NULL) { perror("malloc failed"); exit(EXIT_FAILURE); } for(int i = 1; i <= n; ++i) { ptr[i-1] = i*i; } return ptr; } int main() { int *array = NULL; int n = 5; array = createArray(n); for(int i = 0; i < n; ++i) { printf("%d ", array[i]); } free(array); return 0; }
额外提示
- 必须检查
malloc的返回值:如果内存分配失败,malloc会返回NULL,提前处理能避免后续非法内存访问。 - 动态分配的内存使用完毕后,一定要用
free()释放,防止内存泄漏。
内容的提问来源于stack exchange,提问作者Kurbamit
相关产品推荐
相关产品推荐

