我已经在main中打开了一个2d数组,并且我正在尝试在另一个函数中向其中添加项目。信息在功能上是正确的,但在其主要元素之外,则变成了随机的事物。

void addpassenger(char** seatedbus,char** seatedeco,char** seatedstd,int busct,int ecoct,int stdct){

    busct++;
    seatedbus=realloc(seatedbus,sizeof(seatedbus)*busct);
    addtoarray(seatedbus,"bus",busct-1);
    ecoct++;
    seatedeco=realloc(seatedeco,sizeof(seatedeco)*ecoct);
    addtoarray(seatedeco,"econ",ecoct-1);
}

void addtoarray(char** array,char* item,int index){
    array[index]=malloc(sizeof(char)*strlen(item));
    strcpy(array[index],item);
}

int main() {
    char** seatedpassengerbus=(char **)malloc(sizeof(char)*1);
    char** seatedpassengereco=(char **)malloc(sizeof(char)*1);
    char** seatedpassengerstd=(char **)malloc(sizeof(char)*1);
    int busct=0;
    int ecoct=0;
    int stdct=0;
    addpassenger(seatedpassengerbus,seatedpassengereco,seatedpassengerstd,busct,ecoct,stdct);
    return 0;
}


这是我正在做的工作的基本结构,因为这是我的功课,我无法共享代码的每个部分,但是这些通常是发生问题的地方,知道为什么会发生以及如何解决它?

最佳答案

两个问题:


您忘记了strlen不计算字符串空终止符。意思是

array[index]=malloc(sizeof(char)*strlen(item));


将分配一个字节给一点,那

strcpy(array[index],item);


因此将超出范围导致未定义行为。
通过将值复制到函数局部参数变量中,您会忘记C中的参数是按值传递的。所以当你做

seatedbus=realloc(seatedbus,sizeof(seatedbus)*busct);


您只能在seatedbus函数内分配给本地addpassenger变量。此分配不会发生在seatedpassengerbus函数中的main变量上。


解决第二个问题的一种可能方法是通过使用地址操作符&将指针传递给变量seatedpassengerbus来模拟按引用传递。不幸的是,这意味着您将成为three-star programmer,因为需要修改addpassenger函数以使用三指针(需要取消引用)。

07-24 22:19