我已经在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
函数以使用三指针(需要取消引用)。