C 返回两个指向动态数组的指针
我在指针和动态数组方面遇到了很多问题。 我有一个我调用的函数,它做了很多事情,比如从动态数组中删除一个元素,这会导致我将内存重新分配到这些动态数组中的一个。问题是我在函数中调用函数,无法将所有值正确返回到Main。 既然我不能返回2个值,我该怎么做C 返回两个指向动态数组的指针,c,arrays,pointers,dynamic-arrays,C,Arrays,Pointers,Dynamic Arrays,我在指针和动态数组方面遇到了很多问题。 我有一个我调用的函数,它做了很多事情,比如从动态数组中删除一个元素,这会导致我将内存重新分配到这些动态数组中的一个。问题是我在函数中调用函数,无法将所有值正确返回到Main。 既然我不能返回2个值,我该怎么做 structure1* register(structure1 *registerArray,structure2 *waitingList, int counter){ //Bunch of code in here registe
structure1* register(structure1 *registerArray,structure2 *waitingList, int counter){
//Bunch of code in here
registerArray = realloc(inspecao, (counter)+1);
waitingList = eliminate(waitingList, 5, counter); //Doesn't matter what it does really
return registerArray;
}
structure1* eliminate(structure1 *arrayToEliminateFrom, int positionToEliminate, int *counter){
//The code for this doesn't matter
//All I do is eliminate an ellement and reallocate it
arrayToEliminateFrom = realloc(arrayToEliminateFrom, (*counter-1)*sizeof(structure1))
return arrayToEliminateFrom;
}
如您所见,我不知道如何将waitingList动态数组的指针返回到Main。我该怎么做?
我到处都找过了。
“帮助”您应该尝试使用更高的结构,该结构包含指针,并在函数之间传递和返回该结构,因为函数只能返回一个对象/结构,但您的结构/对象可以包含更多的对象/结构 首先,根据您的评论,您认为您的讲师想要什么:
void
xregister(structure1 **registerArray, int *arrayCount,
structure1 **waitingList, int *waitCount)
{
// Bunch of code in here
*arrayCount += 1;
*registerArray = realloc(inspecao, *arrayCount * sizeof(structure1));
// Doesn't matter what it does really
eliminate(waitingList, 5, waitCount)
}
void
eliminate(structure1 **arrayToEliminateFrom, int positionToEliminate,
int *count)
{
// The code for this doesn't matter
*count -= 1;
// All I do is eliminate an ellement and reallocate it
*arrayToEliminateFrom = realloc(*arrayToEliminateFrom,
*count * sizeof(structure1))
}
以下是罗伯托和我的建议。实际上,我的方法是一种通用的可变长度数组方法,只需稍微改变字段即可完全通用。在某种程度上,既然你已经在使用结构,我不明白为什么你的导师会反对,因为这是一种标准的方法。不那么麻烦,更干净
struct vector {
int vec_count;
structure1 *vec_base;
};
void
xregister(vector *registerArray,vector *waitingList)
{
// Bunch of code in here
registerArray->vec_count += 1;
registerArray->vec_base = realloc(registerArray->vec_base,
registerArray->vec_count * sizeof(structure1));
// Doesn't matter what it does really
eliminate(waitingList, 5)
}
void
eliminate(vector *arrayToEliminateFrom, int positionToEliminate)
{
// The code for this doesn't matter
arrayToEliminateFrom->vec_count -= 1;
// All I do is eliminate an ellement and reallocate it
arrayToEliminateFrom->vec_base = realloc(arrayToEliminateFrom->vec_base,
arrayToEliminateFrom->vec_count * sizeof(structure1))
}
这里有一个更简洁的方法:
struct vector {
int vec_count;
structure1 *vec_base;
};
void
vecgrow(vector *vec,int inc)
{
vec->vec_count += inc;
vec->vec_base = realloc(vec->vec_base,vec->vec_count * sizeof(structure1));
}
void
xregister(vector *registerArray,vector *waitingList)
{
// Bunch of code in here
vecgrow(registerArray,1);
// Doesn't matter what it does really
eliminate(waitingList, 5)
}
void
eliminate(vector *arrayToEliminateFrom, int positionToEliminate)
{
// The code for this doesn't matter
vecgrow(arrayToEliminateFrom,-1);
}
我不知道你在问什么,但是任何“返回n个值”的问题都可以通过传递一个指向n个要写入的变量的指针来解决。这并没有解决问题。我不知道如何使用指向指针的指针。我将为您真正的问题提供一个答案,但是
register
实际上是一个旧的C关键字属性,如extern
或static
。现在没有太多使用,但作为符号仍然是非法的,所以只需将其重命名(例如registerx或xregister或register_array)Craig,我在stackoverflow上写时将函数名改为register。。因为函数的名称是葡萄牙语的,可能会让人困惑,所以您的想法是正确的(我也打算提出同样的建议)。这可能有助于通过重新编码他的资料来充实OP。(例如)使用额外的结构,大多数func现在可以返回void并且[需要]只接受一个参数。这可能并不明显,我要感谢你们所有人的回答。我认为我的老师不希望我这么做。我想通过将动态数组的指针传递给函数,它会自动改变。但它似乎是在复制,而不是改变原件。如何通过引用或指针传递到指针?