2016-05-24 67 views
-1

版本1:如何使用雙指針作爲指針數組?

struct mydef_s1 { 
    int argc; 
    char *argv[3]; 
};   

struct mydef_s1 *p1 = (struct mydef_s1*) malloc (sizeof (struct mydef_s1));  
p1->argv[0] = malloc (8); 
p1->argv[1] = malloc (16); 
p1->argv[2] = malloc (24); 

Now, I want to achieve above with the following structure declaration? 

版本2:

struct mydef_s2 { 
    int argc; 
    char **argv; 
}; 

如果我正確的,那麼下面想在內存指針& 4分配僅8個字節(4整我機)

struct mydef_s2 *p2 = (struct mydef_s2*) malloc (sizeof (struct mydef_s2)); 

什麼sho我需要做以下事情嗎?

p2->argv[0]= malloc(4); 
p2->argv[1]=malloc(8); 
+0

你是不是指'p1-> argv [2] = malloc(24);'? –

+0

看起來像一個可怕的想法。你怎麼知道數組中每個條目分配塊的時間長度?可能是XY問題。你實際上想要達到什麼目標? – Olaf

回答

0

在指針的情況下的指針等

struct mydef_s2 { 
    int argc; 
    char **argv; 
}; 

你必須先分配的內存argv本身,那麼對於argv[i]秒。

喜歡的東西(代碼是沒有錯誤檢查

argv = malloc(n * sizeof*argv); //allocate memory to hold 'n' number of 'argv[i]'s 
    for (i = 0; i < n; i++) 
     argv[i] = malloc(32); //allocate individual `argv[i]`s 

將做的工作。

+0

明白了,謝謝! – sniper

+0

@sniper,如果您覺得這是您問題的最佳答案,請點擊旁邊的複選框接受它。 –

+0

@sniper:請注意,這與您的問題中的方法不同,後者爲每個指針使用可變大小的塊。如果您確實需要恆定大小,請改用二維數組。這可以通過一次調用來分配/釋放。否則,你必須跟蹤每個塊的大小。具有_flexible數組成員_的'struct'會派上用場。 – Olaf

0

C中的指針行爲有點像數組。然而,指向指針的指針與二維數組完全不同。

如果您的意思是您輸入的內容,即 - 非編譯時間已知大小的指向非編譯時間已知大小的字符數組的指針大小的數組,那麼您將需要這樣做。爲指針數組分配存儲空間,將其放置在你的argv中,然後用一個指針(可能動態分配malloc)來初始化每個位置的實際字符數組。

另一方面,如果您的意思是一個二維數組,您有兩種方法可以繼續。一個是做上面的,可能通過在一個malloc中一次分配內部嵌套來節省一個步驟。這在記憶中有些浪費。

另一種選擇是模擬編譯器爲二維數組做什麼。將n * m個字符分配爲單維數組,並使用公式i = r*m + c跳轉到其中,其中r是行索引,m是行大小,c是列索引。

雖然有些冗長,但這是C在定義二維數組時所做的工作。分配,初始化和使用比替代方法更快。

+0

如果所有行都具有相同的大小,則2D陣列是更好的方法。但是,爲什麼你將它的使用限制在編譯時大小?只需使用VLA,例如'char(*)[len_var]' – Olaf