2015-03-31 81 views
-3

我有2個功能:如何複製結構指針

Func.h

struct Ex 
    { 
     int a; 
     int b; 
    } 

Func.cpp

void Copy(Ex ** ex1, Ex *ex2) 
{ 
    // 
} 

void Init(Ex **ex) 
{ 
    *ex = (Ex*)malloc(3*sizeof(Ex)); 
    Ex *ex2 = (Ex*)malloc(sizeof(Ex)); 
    Copy(&(*ex+1), ex2)    //error here 
} 

誰能告訴我怎樣才能解決這個錯誤?

謝謝!!!

+3

不要投malloc'的'結果在C – crashmstr 2015-03-31 15:19:31

+2

'&(*防爆+ 1) '< - 你的意思是'ex'和一個普通的'e'? – Michael 2015-03-31 15:20:23

+1

@crashmstr你說的很對,但是OP又說了'Func.cpp'......令人困惑。 – 2015-03-31 15:20:23

回答

1

您遇到的困難是因爲您沒有在您的Init函數中創建3指針類型struct Ex。您只是創建一個指向的內存塊,該內存塊足夠容納3個結構體Ex。這很好,但不能依賴正常的數組語法來傳遞或訪問ex中的值。 負責在ex內提供指向您想要的任何值的指針地址。

以下是您的代碼的一個簡單示例。 Init已被更改爲採用的附加參數數字結構爲創建大小的初始值abb的初始值。

個人而言,我發現將main中的原始結構創建爲struct Ex **ex然後將該地址作爲三指針傳遞給Init很容易,但這取決於您。你們的做法保持一致,看看下面的例子:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

struct Ex 
{ 
    int a; 
    int b; 
}; 

/* simple copy funciton */ 
void Copy(struct Ex *ex1, struct Ex *ex2) 
{ 
    memcpy (ex1, ex2, sizeof (struct Ex)); 
} 

/* arguments, address of *ex, num to create, initial values .a=va, .b=vb */ 
void Init(struct Ex **ex, size_t n, int va, int vb) 
{ 
    size_t i = 0; 
    size_t offset = sizeof **ex; 

    *ex = malloc (n * offset); 
    struct Ex *ex2 = malloc (sizeof *ex2); 

    ex2-> a = va; 
    ex2-> b = vb; 

    for (i = 0; i < n; i++) 
     Copy (*ex + i * offset, ex2); 
} 

int main (void) { 

    struct Ex *ex = NULL; 
    size_t offset = sizeof *ex; 
    size_t i = 0; 

    Init (&ex, 3, 5, 6); /* initialize 3 ex, with initial values of 5, 6 */ 

    for (i = 0; i < 3; i++) 
     printf ("\n (ex +%2lu)->a : %d\n (ex +%2lu)->b : %d\n", 
       i * offset, (ex + i * offset)->a, i * offset, (ex + i * offset)->b); 

    return 0; 
} 

輸出

$ ./bin/structinitcopy 

(ex + 0)->a : 5 
(ex + 0)->b : 6 

(ex + 8)->a : 5 
(ex + 8)->b : 6 

(ex +16)->a : 5 
(ex +16)->b : 6