2010-08-08 67 views
3

GCC 4.4.4 C89分配字符緩衝區的指針的數組

warning assignment makes integer from pointer without a cast 
**devices = device_buff; 
warning: value computed is not used 
*devices++; 

我得到用下面的代碼在上述的警告。我想要做的是從用戶那裏得到一個輸入。並將該char數組分配給一個指針數組。所以我的指針數組將包含所有輸入的設備。不過,我得到這個線UB:

**devices = device_buff; 

任何意見非常感謝,

static void device_input() 
{ 
#define DEVICE_SIZE 80 
    char device_buff[DEVICE_SIZE] = {0}; 
    char **devices = NULL; 
    size_t i = 0; 

    for(i = 0; i < 3; i++) { 
     printf("Enter device name: "); 
     fgets(device_buff, (size_t)DEVICE_SIZE, stdin); 

     **devices = device_buff; 
     *devices++; 
    } 

    /* NULL terminate last element */ 
    *devices = NULL; 

    printf("Display devices\n"); 
    while(*devices != NULL) { 
     printf("Device [ %s ]\n", *devices++); 
    } 
} 

回答

1

您必須爲Buffer-ARRAY使用動態或預定義分配。 示例中的Endmarker是一個空字符串,不是NULL指針。

#define DEVICE_SIZE 80 
typedef char DBuff[DEVICE_SIZE]; 

static void device_input() 
{ 
    #define MAXB 3 
    DBuff device_buff[MAXB+1]; 
    DBuff *devices=device_buff; 
    size_t i = 0; 

    for(i = 0; i < MAXB; i++,devices++) { 
     printf("Enter device name: "); 
     fgets(*devices, (size_t)DEVICE_SIZE, stdin); 
    } 
    **devices=0; 
    devices=device_buff; 
    printf("Display devices\n"); 
    while(**devices) { 
    printf("Device [ %s ]\n", *devices++); 
    } 
} 
3

**devices是一個char,device_buff爲char類型的數組。這兩種類型是不兼容的。

3

您正在取消引用空指針。沒有什麼好的可以出來的

char** devices = NULL; 

初始化指針NULL。它從來沒有被設置爲其他任何東西,然後被解除引用(兩次)。

指針被認爲很難使用它們,如果不能準確理解,他/她正在做什麼。我認爲你的情況有兩種選擇。您可以將名稱存儲在一個char陣列中,一個陣列靠近另一個陣列,並保存一組指向這些名稱開頭的指針,或者可以使用一組數組(兩維數組)來分別存儲每個名稱的名稱在另一個陣列。我認爲第二種方法更簡單,你應該開始工作。

可以定義該陣列這樣

#define NUM_OF_NAMES 3 

char devices[NUM_OF_NAMES][DEVICE_SIZE] = {0}; 

現在devices[0]devices[1]devices[2]都是char陣列char[DEVICE_SIZE]類型的。您可以預先使用它們中的每一樣,緩衝器。

+0

「如果一個人不能確切地理解他/她在做什麼,那麼就不可能使用它們」 - 有點像整數?不,他們不是「硬」的。 – 2010-08-08 18:03:09

+0

@Neil就像整數一樣,如果我們談論專業編程,但是你必須承認,整數和指針對於我們在這裏總是看到的大量程序員來說是不同的。在他們的案例中,只使用整數的程序有很高的工作機會。指針需要更多的猴子和更多的時間。在這個意義上他們更難。 – 2010-08-09 16:26:41

3

即使您修復了編譯器錯誤(如其他人所述),您嘗試執行的操作也不起作用。您每次都在同一個device_array上調用fgets(),所以每次調用它時,都會覆蓋之前存儲的內容。

可能的解決方案包括使用多個字符數組(例如char device_buff[3][DEVICE_SIZE])或一個長陣列,並且每次調用fgets()時都會前進一個指針。