我将一个指向typedef结构体的指针传递给一个函数,该函数假设设置了typedef结构体以供使用。在传递给函数之前,该结构已经被绑定了。在访问函数中的结构体时,我会收到EXC_BAD_ACCESS。我不明白的是,名为pool的typedef结构的值在前一个函数中是有效的,但一旦它被传递,它就无效了。这可以在下面的回溯中看到。在研究这个问题的时候,我看到了类似的问题,但是这些是由于将变量的副本传递给函数而不是指针,或者因为变量是局部变量,并且在函数退出时它超出了范围。我不相信这些是问题,因为声明和mableced池的函数还没有退出,并且我正在传递一个指向池但不是池副本的指针。那么在将它传递给initNamePool之后,pool如何变为NULL?将指针传递给函数损坏指针
回溯,在这里你可以看到,池在 “initResourcePool” 和 “initPools” 有效的,但不是 “initNamePool”
(lldb) thread backtrace
* thread #1: tid = 0x53998, 0x000000010000325b sysfuzz`initNamePool(pool=0x0000000000000000) + 27 at namePool.c:201, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x4020)
* frame #0: 0x000000010000325b sysfuzz`initNamePool(pool=0x0000000000000000) + 27 at namePool.c:201
frame #1: 0x0000000100002cf5 sysfuzz`initPools(pool=0x00000001003eafe0) + 37 at pool.c:51
frame #2: 0x0000000100002c80 sysfuzz`initResourcePool(pool=0x00000001003eafe0) + 48 at pool.c:87
frame #3: 0x0000000100001830 sysfuzz`initSysFuzz(data=0x00000001003d4fd0) + 48 at interactor.c:19
frame #4: 0x00000001000017ba sysfuzz`initAndRunSysFuzz + 58 at interactor.c:103
frame #5: 0x0000000100001599 sysfuzz`main + 25 at start.c:12
frame #6: 0x00007fff956395c9 libdyld.dylib`start + 1
frame #7: 0x00007fff956395c9 libdyld.dylib`start + 1
的定义数据 - > pool-> nPool和getDirName
static int getDirName(char **dir, namePool *pool)
{
poolArgs *args;
args = (poolArgs *) malloc(sizeof(poolArgs));
if(args == NULL)
{
return -1;
}
launchSynch(pool->serialQueue, gdn, &args);
dir = args->dir;
free(args);
return 0;
}
typedef struct namePool namePool;
struct namePool
{
char *fileNameIndex[1025];
char *dirNameIndex[1025];
queue serialQueue;
int (*getFileName)(char **, namePool *);
int (*getDirName)(char **, namePool *);
int (*fillPool)(namePool *);
int (*drainPool)(namePool *);
bool isPoolDrained;
};
这里我们声明的数据是一个typedef结构,它拥有池。两者都在“initFuzzData”中进行匹配。
int initAndRunSysFuzz()
{
/* Declarations. */
int rtrn;
fuzzData *data;
data = initFuzzData();
if(data == NULL)
{
return -1;
}
rtrn = initSysFuzz(data);
if(rtrn < 0)
{
cleanUpFuzzData(data);
return -1;
}
...
}
fuzzData *initFuzzData()
{
fuzzData *data;
data = (fuzzData *) malloc(sizeof(fuzzData));
if(data == NULL)
{
return NULL;
}
data->pool = (resourcePool *) malloc(sizeof(resourcePool));
if(data->pool == NULL)
{
return NULL;
}
data->pool->nPool = (namePool *) malloc(sizeof(namePool));
if(data->pool->nPool == NULL)
{
return NULL;
}
...
}
后,我们的malloc数据和数据>游泳池,我们通过 “initSysFuzz”
static int initSysFuzz(fuzzData *data)
{
int rtrn;
rtrn = initResourcePool(data->pool);
if(rtrn < 0)
{
return -1;
}
...
}
“initSysFuzz” 呼叫 “initResourcePool”
int initResourcePool(resourcePool *pool)
{
int rtrn;
rtrn = initPools(pool);
if(rtrn < 0)
{
printf("Can't Init Pools\n");
return -1;
}
...
}
数据依次调用“ initPools”
static int initPools(resourcePool *pool)
{
int rtrn;
rtrn = initNamePool(pool->nPool);
if(rtrn < 0)
{
printf("Can't init name pool\n");
return -1;
}
....
}
这里是崩溃的地方,在“initNamePool”,pool-> getDirName =&getDirName的第一行; 。
int initNamePool(namePool *pool)
{
pool->getDirName = &getDirName;
...
}
您正在将'pool-> nPool'传递给'initNamePool',但您从未为该指针分配任何内容。告诉我们你的代码在哪里'pool-> nPool = ....'完成了,因为我没有看到它。 – WhozCraig 2014-12-19 04:16:35
我做了malloc pool-> nPool它只是在事故问题中不存在,它在initFuzzData中的数据 - >池后马上连接。 – 2trill2spill 2014-12-19 04:24:23
尝试打印分配后的变量地址,以及函数调用之前和之后(或函数内部)。也许这会澄清情况。 – NikolayKondratyev 2014-12-19 04:54:32