2012-11-07 66 views
0

我在一個簡單的文件系統,其(明顯)包含文件夾,文件等的C結構構件是一個字符串,如何分配字節直接

的文件夾由a表示(一個簡化版本)工作結構,而在RAM中,像這樣:

typedef struct{ 
    char label[20]; 
    unsigned int id; 
    t_node contents[50]; 
} folder; 

現在,我當然希望標籤包含在它的原始字節字符串名稱(甚至更好的將是原始字符串沒有尾隨0,但這是一個犧牲我願意做)。

不,這裏是我如何創建和使用結構:「分配給從類型‘的char *’類型‘的char [20]’當不兼容的類型」

folder* myFolder = (folder *) malloc(sizeof(folder)); 
myFolder->label = "name"; 

//Which doesn't work, if I try this: 

char name[20] = "name"; 
myFolder->label = name; 

//this too, doesn't work. 

錯誤消息說。 我的理解,但不知道如何解決。

在此先感謝

回答

4

使用strncpy()

char name[20] = "name"; 
strncpy(myFolder->label, name, sizeof(myFolder->label) - 1); 
myFolder->label[sizeof(myFolder->label) - 1] = 0; 
+0

對於'strncpy'而不是'strcpy' +1 – Rob

+0

我不同意; 'strncpy'並不比'strcpy'安全。它被引入來處理結構中的固定長度的名稱字段,而不是提供「有界的」strcpy。 – md5

+0

@Kirilenko:那麼,我們*是處理固定長度的struct字段,不是嗎? – NPE

1

您需要使用strcpy

strcpy(myFolder->label, "name"); 
1

數組是不是一個修改的左值,所以你不能分配一個值它。您有幾種解決方案:

  • 聲明label作爲指向char的指針;
  • 使用strcpy(或等價物)。
+0

現在這不會很實用(你的第一選擇),因爲節點是文件系統的一部分(將被寫入磁盤)。爲了在fs中的任何其他位置找到標籤,只是因爲malloc指向那裏會使其非常緩慢。但是這個建議很受歡迎。 –

2

嘗試使用strncpy()

strncpy(myFolder->label, "name", 20); 

,而不是

myFolder->label = "name"; 

不能使用賦值運算符來填充數組,在這種情況下的「名稱」右側會解決到一個字符指針。

此外,我會建議更換常數20與一些定義常數,指示什麼值(即MAX_FOLDER_LABEL_LEN)。