C - 从函数返回数组
C - Returning array from function
我的问题是,我有一个包含 .c 文件的 C 项目:
trab.c
ordena.c
persistencia.c
persistencia.c
是我需要从 .txt 文件中读取 X 个整数的地方
trab.c
有主。我必须调用 persistencia.c
来获取 X 数组(由主参数定义)整数并从 ordena.c
调用排序函数将所述数组作为参数传递。
我的问题是。什么是不太完整的方法呢?
我可以声明一个全局数组而不是通过参数传递吗?
我可以使用 malloc 从另一个 class 访问 var 吗?
您可以使用 malloc
分配一个 X
int
的数组(我假设您知道并且提前有 #define
d X)。
int *array = malloc( X * sizeof(int) );
malloc
returns a pointer(一个变量存储在内存中的地址)到数组。如果 X
不是先验已知的,您可以通读文件以确定有多少 int
并添加另一个 int*
参数以告知调用者读取了多少。您可以从 persistencia.c 中的函数 return ptr,只要明确调用者对 free
内存负责即可。函数声明看起来像
int *readInts();
要将数组传递给 ordena.c 中的函数,您可以将其作为 int*
类型的参数
void ordena(int *array, size_t length);
Logan Rakai 有一个很好的答案,但是,我希望提供一种不同的方法,因为我的经验表明 not 比 return 动态分配内存更好(有时不是)。
更灵活的设计是编写一个接受指针和数组大小的函数。
此外,在编写需要维护的长期项目时(可能不仅仅是您自己,也可能由其他程序维护),最好将 "concerns" 放在一起。
一个很好的例子是,当内存管理(free
)由调用函数执行时,内存分配(malloc
)最好在同一个调用函数中执行。 .. 在不同函数之间拆分内存管理问题时,未来的维护者更有可能将内存泄漏引入代码中。
在这种情况下,使用堆栈或 malloc
分配数组并传递它非常简单。
即,这里有一个快速(有点无用)的示例,用于将内存管理问题转移到调用函数中 (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¢。可能我的错误管理代码有点反常,但是 returning -1
错误比人们相信的更常见。
我的问题是,我有一个包含 .c 文件的 C 项目:
trab.c
ordena.c
persistencia.c
persistencia.c
是我需要从 .txt 文件中读取 X 个整数的地方
trab.c
有主。我必须调用 persistencia.c
来获取 X 数组(由主参数定义)整数并从 ordena.c
调用排序函数将所述数组作为参数传递。
我的问题是。什么是不太完整的方法呢? 我可以声明一个全局数组而不是通过参数传递吗? 我可以使用 malloc 从另一个 class 访问 var 吗?
您可以使用 malloc
分配一个 X
int
的数组(我假设您知道并且提前有 #define
d X)。
int *array = malloc( X * sizeof(int) );
malloc
returns a pointer(一个变量存储在内存中的地址)到数组。如果 X
不是先验已知的,您可以通读文件以确定有多少 int
并添加另一个 int*
参数以告知调用者读取了多少。您可以从 persistencia.c 中的函数 return ptr,只要明确调用者对 free
内存负责即可。函数声明看起来像
int *readInts();
要将数组传递给 ordena.c 中的函数,您可以将其作为 int*
void ordena(int *array, size_t length);
Logan Rakai 有一个很好的答案,但是,我希望提供一种不同的方法,因为我的经验表明 not 比 return 动态分配内存更好(有时不是)。
更灵活的设计是编写一个接受指针和数组大小的函数。
此外,在编写需要维护的长期项目时(可能不仅仅是您自己,也可能由其他程序维护),最好将 "concerns" 放在一起。
一个很好的例子是,当内存管理(free
)由调用函数执行时,内存分配(malloc
)最好在同一个调用函数中执行。 .. 在不同函数之间拆分内存管理问题时,未来的维护者更有可能将内存泄漏引入代码中。
在这种情况下,使用堆栈或 malloc
分配数组并传递它非常简单。
即,这里有一个快速(有点无用)的示例,用于将内存管理问题转移到调用函数中 (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¢。可能我的错误管理代码有点反常,但是 returning -1
错误比人们相信的更常见。