指向带有malloc和strdup的结构的指针

指向带有malloc和strdup的结构的指针,c,double-pointer,strdup,C,Double Pointer,Strdup,我的主要意图是将一个指向结构的指针传递给一个函数,该函数将分配内存并填充其所有值。回来后我会把它打印在屏幕上 结构看起来像这样 struct isolock{ char *name; unsigned int state;}; typedef struct isolock lock; int main(){ int i = 0; isolock *lock = NULL; fillArray(&lock); //print struct

我的主要意图是将一个指向结构的指针传递给一个函数,该函数将分配内存并填充其所有值。回来后我会把它打印在屏幕上

结构看起来像这样

struct isolock{
    char *name;
    unsigned int state;};
typedef struct isolock lock;
int main(){
    int i = 0;
    isolock *lock = NULL;
    fillArray(&lock);

    //print struct contents
    for(i=0;(lock+i)->name;i++){
            printf("name = %s status = %u \n", (lock+i)->name,(lock+i)->state);
    }
请注意,我无法更改此结构的声明。我的主要功能非常简单,就像这样

struct isolock{
    char *name;
    unsigned int state;};
typedef struct isolock lock;
int main(){
    int i = 0;
    isolock *lock = NULL;
    fillArray(&lock);

    //print struct contents
    for(i=0;(lock+i)->name;i++){
            printf("name = %s status = %u \n", (lock+i)->name,(lock+i)->state);
    }
}

fillArray函数假定为我的结构分配n+1个内存块,其中n是实际存在的锁数。而最后(n+1)个块将用零填充。因此,当从main打印时,我可以检查这个条件,而不必担心我分配的结构的长度

我的问题在于fillArray函数

static const char *array[] = {"SWMGMT_LOCK","OTHER_LOCK"};
void fillArray(isolock **dlock){
    int i = 0;
    if (*dlock == NULL){
            *dlock = (isolock *)malloc((sizeof (*dlock)) * 3);      //allocate space for holding 3 struct values

            for(i=0;i<2;i++){
                    (*(dlock) + i)->name = strdup(array[i]);       
                    (*(dlock) + i)->state = (unsigned int)(i+1);                                           
            }
            (*(dlock) + i)->name = 0;   //LINE100
            (*(dlock) + i)->state = 0;
    }
}
o/p:

name =  status = 1 
name = OTHER_FP_LOCK status = 2 
static const char*array[]={“SWMGMT_LOCK”,“OTHER_LOCK”};
空填充数组(IsLock**dlock){
int i=0;
如果(*dlock==NULL){
*dlock=(isolock*)malloc((sizeof(*dlock))*3);//为保存3个结构值分配空间
for(i=0;iname=strdup(数组[i]);
(*(dlock)+i)->state=(unsigned int)(i+1);
}
(*(dlock)+i)->name=0;//LINE100
(*(dlock)+i)->状态=0;
}
}
o/p:
名称=状态=1
名称=其他\u FP\u锁定状态=2
实际上,这行100导致了问题。它实际上替换了已经填充的结构条目,即,这行使dlock[0]->name用0填充。而dlock[1]保持不变

我的gdb日志显示了类似的内容

struct isolock{
    char *name;
    unsigned int state;};
typedef struct isolock lock;
int main(){
    int i = 0;
    isolock *lock = NULL;
    fillArray(&lock);

    //print struct contents
    for(i=0;(lock+i)->name;i++){
            printf("name = %s status = %u \n", (lock+i)->name,(lock+i)->state);
    }
所有这些都是在分配和填充值之后获取的日志

    (gdb) p (*(dlock)+0)
    $10 = (isolock *) 0x804b008
    (gdb) p (*(dlock)+1)
    $11 = (isolock *) 0x804b010 
    (gdb) p (*(dlock)+2)                      <== Note here 1
    $12 = (isolock *) 0x804b018
    (gdb) p *(*(dlock)+0)
    $13 = {name = 0x804b018 "SWMGMT_LOCK", state = 1}     <== Note here 2
    (gdb) p *(*(dlock)+1)
    $14 = {name = 0x804b028 "OTHER_FP_LOCK", state = 2}
    (gdb) n
    33    (*(dlock) + i)->state = 0;
    (gdb) 
    35   }
    (gdb) p *(*(dlock)+2)
    $15 = {name = 0x0, state = 0}
    (gdb) p (*(dlock)+2)
    $16 = (isolock *) 0x804b018
(gdb)p(*(dlock)+0)
$10=(isolock*)0x804b008
(gdb)p(*(dlock)+1)
$11=(isolock*)0x804b010
(gdb)p(*(dlock)+2)name=0导致dlock[0]->name被0填充

为了便于解释这个问题,, Malloc给了我三个地址。为了便于理解,让我们说,{100010081010} 我已经两次调用strdup,它返回了{10101018}

此1010和1018分别存储在锁[0]和锁[1]的char*名称中

有人能告诉我,我在这段代码中是做错了什么,还是因为strdup(分配已经分配的内存块)的问题


注意:当我将char*name更改为char name[20]并使用strcpy代替strdup时,它工作得非常好。

可能的错误原因是您的分配:

*dlock = (isolock *)malloc((sizeof (*dlock)) * 3);

这里
dlock
是指向指针的指针,因此
sizeof(*dlock)
是指针的大小,与
sizeof(struct isolock)
不同(或
sizeof(*dlock)
)首先,你做了一个TyBuffFraseIsSoCK锁,然后使用ISOLoCK作为一种类型?它可能会用C++来工作,因为它会自动使ISOLoop一个类型,也就是说你的for循环太短了:for for(i=0;i<3;i++){}{}。