C-从函数返回数组
我的问题是,我有一个包含.C文件的C项目:C-从函数返回数组,c,arrays,global,param,C,Arrays,Global,Param,我的问题是,我有一个包含.C文件的C项目: trab.c ordena.c persistencia.c persistencia.c是我需要从.txt文件中读取X个整数的地方 trab.c具有主要功能。其中,我必须调用persistencia.c以获取X(由主参数定义)整数数组,并从ordena.c调用排序函数,将所述数组作为参数传递 我的问题是。不太复杂的方法是什么? 我可以声明一个全局数组而不是通过参数传递吗? 我可以使用malloc访问另一个类的var吗?您可以使用malloc分配Xi
trab.c
ordena.c
persistencia.c
persistencia.c
是我需要从.txt文件中读取X个整数的地方
trab.c
具有主要功能。其中,我必须调用persistencia.c
以获取X(由主参数定义)整数数组,并从ordena.c
调用排序函数,将所述数组作为参数传递
我的问题是。不太复杂的方法是什么?
我可以声明一个全局数组而不是通过参数传递吗?
我可以使用malloc访问另一个类的var吗?您可以使用
malloc
分配X
int
s数组(我假设您知道并且已经事先定义了
dx)
malloc
向数组返回一个(存储内存中地址的变量)。如果事先不知道X
,则可以通读该文件以确定有多少int
s,并添加另一个int*
参数来告知调用方读取了多少。您可以从persistencia.c中的函数返回ptr,只要调用方有责任释放内存。函数声明如下所示
int *readInts();
要将数组传递给ordena.c中的函数,可以将其作为类型为int*
void ordena(int *array, size_t length);
Logan Rakai有一个很好的答案,但是,我希望提供一种不同的方法,因为我的经验表明,在可能的情况下最好不要返回动态分配的内存(有时不是这样)
更灵活的设计是编写一个接受指针和数组大小的函数
此外,在编写需要维护的长期项目时(可能不仅仅由您自己维护,也由其他程序维护),最好将“关注点”放在一起
一个很好的例子是,当调用函数执行内存管理(free
)时,最好在同一调用函数中执行内存分配(malloc
)。。。当在不同功能之间划分内存管理问题时,未来的维护人员很可能会在代码中引入内存泄漏
在这种情况下,使用堆栈或malloc
分配一个数组并传递它是非常简单的
i、 例如,这里有一个快速(有些无用)的示例,用于将内存管理问题转移到调用函数(main
)中。请注意,这允许您在调用与数组相关的函数时同时使用动态内存分配和堆栈分配
size_t get_array_size(void /* or any parameters */) {
/* do whatever you need */
return 10; /*for our example */
}
void fill_array(int *arry, size_t size) {
while (size) {
size--;
arry[size] = 1; /* fill in data here */
}
}
int use_array(int *arry, size_t size) {
fprintf(stderr, "***\n");
while (size) {
size--;
arry[size] -= 1; /* do whatever */
fprintf(stderr, "array[%lu] == %d\n", size, arry[size]);
}
return 0; /* or return -1 for error */
}
int main(int argc, char const *argv[]) {
int array1[20];
int *array2;
size_t array2_size = get_array_size();
array2 = malloc(sizeof(*array2) * array2_size);
fill_array(array1, 20);
fill_array(array2, array2_size);
if (use_array(array1, 20))
perror("WTF?! "), exit(0);
if (use_array(array2, array2_size))
perror("WTF?! "), exit(0);
return 0;
}
那是我的2美分。我的错误管理代码可能有点反常,但在错误上返回-1
的情况更为常见。为什么要声明全局数组?将数组传递给函数时,它将降级为指针。。。这使得它超级简单。对于int
数组,您可以尝试void func(int*array,size\u t length)
。。。然后,只需就地编辑数组。C没有“类”两个警告:1。函数返回动态分配的内存是不常见的,因为它会导致内存泄漏(由于对内存管理的担忧不一);2.关于元素数量的信息呢?这与readInts
有什么关系?谢谢,我将更新答案以注意这些注意事项。@Myst:我认为函数返回指向已分配内存的指针通常并不罕见。显然,无论何时通过malloc()
等方式分配内存,都有泄漏的风险,但即使未返回内存,也可能发生泄漏。函数的设计和如何使用它的文档应该清楚地说明这一点。类似的注释适用于将预先分配的内存传递给函数。递归函数增加了一些曲折——特别是当接口无法更改时。这几乎需要某种形式的全局变量。@JonathanLeffler,我不确定我们是否不同意。我至少编写了一个分配内存的函数(文档对此很清楚)。。。但我确实注意到,大多数设计,特别是在库中,但也在长期维护的项目中,都避免返回分配给malloc
(写东西几个月后,我几乎不记得我做了什么)的内存。根据我的经验,将指针传递到用户分配的内存(允许在堆栈上以及malloc
)是更常见的方法(可能也是更灵活的方法)。
size_t get_array_size(void /* or any parameters */) {
/* do whatever you need */
return 10; /*for our example */
}
void fill_array(int *arry, size_t size) {
while (size) {
size--;
arry[size] = 1; /* fill in data here */
}
}
int use_array(int *arry, size_t size) {
fprintf(stderr, "***\n");
while (size) {
size--;
arry[size] -= 1; /* do whatever */
fprintf(stderr, "array[%lu] == %d\n", size, arry[size]);
}
return 0; /* or return -1 for error */
}
int main(int argc, char const *argv[]) {
int array1[20];
int *array2;
size_t array2_size = get_array_size();
array2 = malloc(sizeof(*array2) * array2_size);
fill_array(array1, 20);
fill_array(array2, array2_size);
if (use_array(array1, 20))
perror("WTF?! "), exit(0);
if (use_array(array2, array2_size))
perror("WTF?! "), exit(0);
return 0;
}