2013-10-27 56 views
7

我將使用strtok讀取兩組char*(或字符串),並且由於這兩組字符是相關的,所以我決定使用一個結構。如何正確malloc爲C的結構數組

struct line* array = (struct line*)malloc(sizeof(file) * sizeof(struct line*)); 

此行malloc的功能ING空間給了我一個分段錯誤,並想知道如果你能以適當的方式告訴我吧malloc空間。對於上下文,這是我的代碼的其餘部分:

struct line 
{ 
    char* addr; 
    char* inst; 
}; 
while loop{ 
    x = strtok(line,": "); 
    y = strtok(NULL,"\n"); 
    strcpy(array[i].addr,x); //assume that x and y are always 3characters 
    strcpy(array[i].inst,++y); 
    i++; 
} 
+2

請介意爲'struct line'數組分配內存不會爲'addr'和'inst'字符串分配內存。根據如何使用'struct line'內的指針,你可能還需要爲字符串數據分配內存。 –

回答

13

分配工作對所有類型都是一樣的。如果你需要分配的line結構數組,你這樣做有:

struct line* array = malloc(number_of_elements * sizeof(struct line)); 

在代碼中,你被分配一個數組,有合適的尺寸line指針,而不是爲line結構。另請注意,沒有理由將返回值設爲malloc()

注意,就是它的更好風格來使用:的

sizeof(*array) 

代替:

sizeof(struct line) 

這樣做的原因是,分配將仍然工作打算的情況下,你改變array類型。在這種情況下,這種情況不太可能發生,但這只是一個值得習慣的事情。

另外請注意,這是可能的,以避免重複詞struct一遍又一遍,通過typedef荷蘭國際集團的結構:

​​

那麼你可以這樣做:

line* array = malloc(number_of_elements * sizeof(*array)); 

當然不要忘記爲array.addrarray.inst分配內存。

3

對於你所描述的東西,你並不需要爲你的結構分配內存,你需要爲會員char *addr;char *inst;分配內存。如果您希望擁有該結構的單個副本,則代碼的第一部分將說明如何初始化和分配值。如果你想要一個數組,第二個代碼示例說明了差異。

這說明如何爲單一結構線的成員分配內存:

typedef struct 
{ 
    char* addr; 
    char* inst; 
}LINE; 

LINE line; 

int main(void) 
{ 

    strcpy(line.addr, "anystring"); //will fail 
    line.addr = malloc(80); 
    line.inst = malloc(80); 
    strcpy(line.addr, "someString");//success; 
    strcpy(line.inst, "someOtherString");//success; 

} 

對於結構線的陣列...

typedef struct 
{ 
    char* addr; 
    char* inst; 
}LINE; //same struct definition 

LINE line[10]; //but create an array of line here. 

int main(void) 
{ 
    int i; 

    for(i=0;i<10;i++) 
    { 
     line[i].addr = malloc(80); 
     line[i].inst = malloc(80); 
    } 

    for(i=0;i<10;i++) 
    { 
     strcpy(line[i].addr, "someString"); 
     strcpy(line[i].inst, "someOtherString"); 
    } 
    //when done, free memory 
    for(i=0;i<10;i++) 
    { 
     free(line[i].addr); 
     free(line[i].inst); 
    }  


} 
+0

或者使用'strdup()'並使用80個字符的其餘部分來獲得更有用的東西。 :-) –

+0

@AdamLiss - 不能爭辯更有用。 – ryyker