2010-08-08 2 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++; 

포인터 배열로 문자 버퍼를 할당 I는 아래의 코드와 상기 경고를 얻는다. 내가하려는 것은 사용자로부터 의견을 얻는 것이다. 그리고 그 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을하는 문자가, device_buff은 문자의 배열입니다. 두 유형은 호환되지 않습니다.

3

널 포인터를 참조 해제하고 있습니다. 좋은 것이 아무것도 없습니다.

char** devices = NULL; 

포인터를 NULL으로 초기화합니다. 그것은 다른 어떤 것에도 설정되어 있지 않고, 다시 참조 해제됩니다 (두 번).

포인터는 어렵다고 생각되며 정확히 이해하지 못하면 포인터를 사용하는 것이 다소 어렵습니다. 시나리오에는 두 가지 옵션이 있다고 생각합니다. 하나의 char 배열에 이름을 저장할 수 있습니다. 하나는 서로 인접 해 있고 그 이름의 시작을 가리키는 포인터 배열을 유지하거나 char 배열 (2 차원 배열)의 배열을 사용하여 각각의 이름을 개별적으로 저장할 수 있습니다 다른 배열에. 나는 두 번째 방법이 훨씬 더 간단하다고 생각한다.

는 이제 devices[0], devices[1]devices[2]은 우선은 이전에 버퍼처럼, 그들 각각을 사용할 수있는 유형 char[DEVICE_SIZE]의 모든 char 배열은이

#define NUM_OF_NAMES 3 

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

같은 배열을 정의 할 수 있습니다.

+0

"그 사람이하고있는 일을 정확하게 이해하지 못하면 오히려 사용하기가 불가능합니다."- 정수와 비슷합니까? 그리고 아니, 그들은 "열심히"하지 않습니다. –

+0

@Neil 정수형과 마찬가지로, 전문 프로그래밍에 대해 말하면, 우리가 항상 보게되는이 프로그래머를위한 정수와 포인터의 차이가 있음을 인정해야합니다. 그들의 경우 정수 만 사용하는 프로그램은 다소 일할 기회가 아주 많습니다. 포인터는 훨씬 더 많은 원숭이와 더 많은 시간을 필요로합니다. 이 의미에서 그들은 더 어렵습니다. –

3

컴파일러 오류 (다른 사람의 설명대로)를 수정하더라도 수행하려는 작업이 작동하지 않습니다. 매번 을 device_array 번으로 호출하기 때문에 호출 할 때마다 이전에 저장된 내용을 덮어 씁니다.

가능한 해결책은 복수 문자 배열 (예 : char device_buff[3][DEVICE_SIZE]) 또는 하나의 긴 배열을 사용하고 fgets()에 전화 할 때마다 포인터를 앞으로 나아갈 수 있습니다.