我的问题是,我有一个包含.c文件的C项目:
trab.c
ordena.c
persistencia.c
persistencia.c
我需要从.txt文件中读取X整数
trab.c
有主要内容。我必须调用persistencia.c
来获取一个X数组(由main中的param定义)整数和调用排序函数ordena.c
将所述数组作为参数传递。
我的问题是。做得不那么简单的方法是什么? 我可以声明一个全局数组而不是通过参数传递吗? 我可以使用malloc从另一个类中获取var吗?
答案 0 :(得分:3)
您可以使用malloc
分配一个X
int
的数组(假设您知道并预先提前#define
d X)。
int *array = malloc( X * sizeof(int) );
malloc
向数组返回pointer(存储地址的变量)。如果X
不熟悉,则可以通读该文件以确定有多少int
个,并添加另一个int*
参数,以便向调用者传入已读取的数量。你可以从persistencia.c中的函数返回ptr,只要它明确是调用者对free
内存的责任。函数声明看起来像
int *readInts();
要将数组传递给ordena.c中的函数,您可以将其作为int*
类型的参数提供
void ordena(int *array, size_t length);
答案 1 :(得分:0)
Logan Rakai有一个很好的答案,但是,我希望提供一种不同的方法,因为我的经验表明,在可能的情况下(有时不是),返回动态分配的内存会更好不。
更灵活的设计是编写一个接受指针和数组大小的函数。
此外,在编写需要维护的长期项目时(可能不仅仅是由您自己,而是由其他程序),最好将“关注点”保持在一起。
一个很好的例子是当调用函数执行内存管理(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¢。我的错误管理代码可能有些不正常,但对错误返回-1
更常见,人们会相信。