今天被几个段错误,栈溢出,free不正确的指针的错误搞得精力憔悴。
之前对于多级指针+函数参数运用始终有点迷糊,今天果真栽这好几个跟头。
这里呢就是想从mysql中提取出几个具有相同条件的数据,一行一行填进去就行了…
定义一个mysqlMsg*cur=NULL;再用&cur传入到下面的函数中为cur动态分配内存空间。
但是我开始使用这块内存是很理所当然这样用的。
int mysqlGetMsgByUid(MYSQL mysql,int uid,mysqlMsg**mMsgList,int *mNum)
{
……
*(mMsgList)=malloc(num_rows*sizeof(mysqlMsg));
while(……){
(mMsgList[i])->id=atoi(row[0]);
(mMsgList[i])->type=atoi(row[1]);
(mMsgList[i])->send_id=atoi(row[2]);
strncpy((mMsgList[i])->message,row[3],MYSQL_MSG_SIZE);
(mMsgList[i])->status=atoi(row[4]);
(mMsgList[i])->flag=atoi(row[5]);
(mMsgList[i])->recv_id=uid;
i++;
}
……
}
事实上mMsgList[i]这样相当于*(mMsgList+i),也就是越过了i×num_rows*sizeof(mysqlMsg)
这么大的区间,i>1时超过了我们分配的区间大小。
于是出现了如下的
free(): invalid pointer
已放弃 (核心已转储)
那正确操作是什么呢???
二重指针先解引用,再偏移i个sizeof(mysqlMsg)再去赋值就没问题了。
(*(mMsgList)+i)->id=atoi(row[0]);
(*(mMsgList)+i)->type=atoi(row[1]);
(*(mMsgList)+i)->send_id=atoi(row[2]);
strncpy((*(mMsgList)+i)->message,row[3],MYSQL_MSG_SIZE);
(*(mMsgList)+i)->status=atoi(row[4]);
(*(mMsgList)+i)->flag=atoi(row[5]);
(*(mMsgList)+i)->recv_id=uid;
当然这是因为我是是为*mMsgList
分配了内存空间,而不是mMsgList,不然之前那个写法是正确的
又如果是以栈区存储的如char arglist[10][20]
这样作为函数参数的话,由于此参数真正意义上是char(*arglist)[20]的数组指针。那么arglist[i]也就代表着一个数组,向这块内存填数据是没有问题的,它并不会直接跨过一个二重数组。
啊,基础扎实很重要啊!