c-如何用文件和malloc构造函数



如果I有一个函数可以处理文件和指针,比如:

int funzione (int *vet)
{
FILE *fin;
if ( !(fin = fopen(name, "r")) )
return 1;
/* read informations from file (like num) */
vet = (int *) malloc (num*sizeof(int));
/* ... */
return fclose(fin); 
}

如何返回vet?非常感谢。

如果您想通过返回值本身以外的其他方式返回它,您可以简单地传入指针并取消引用它。

C是严格按值传递的(给函数的所有内容都是原始函数的副本,对它的更改不会反映回调用方),但您可以用指针模拟按引用传递。你会看到这样的东西:

int funzione (int **pVet)
{
FILE *fin;
if ( !(fin = fopen(name, "r")) )
return 1;
/* read informations from file (like num) */
*pVet = malloc (num * sizeof(int));
/* ... */
return fclose(fin); 
}

你会这样称呼它:

int *myVet;
int result = funzione (&myVet);

您会注意到,我还从malloc中删除了返回时强制转换——在C中这样做是个坏主意,因为它可以隐藏某些细微的错误。

你不应该错误地认为,因为你传递了一个int指针,它会反射回来。如果你想改变的是int,那也没关系。但是,由于要更改的是int指针,因此需要一个指向的指针


但是,请记住,在涉及指针的情况下,返回错误的常见方法只是返回NULL。这是否适合你的情况是你必须决定的。如果可能的话,我会考虑返回指针本身,并使用NULL作为无法获取数据的指示(无法打开文件、无法分配内存、数据不知何故出错、无法关闭文件等等)。

这将类似于:

int *funzione (void) {
FILE *fin = fopen(name, "r");
if (fin == NULL) return NULL;
/* read informations from file (like num) */
int *pVet = malloc (num * sizeof(int));
if (pVet == NULL) return NULL;
// Populate pVet as needed. Any error must free it before
//   returning NULL, such as with:
if (fclose(fin) != 0) {
free (pVet);
return NULL;
}
return pVet;
}

一个选项是定义一个结构,该结构保存FILE*和要返回的整数数组。

你可以定义如下:

struct funzione_result {
int fclose_result;
int *vet;
}

然后分配给你职能中的每个成员。你仍然需要记住释放兽医阵列。

相关内容

  • 没有找到相关文章

最新更新