присвоение буфера символов массиву указателей - PullRequest
3 голосов
/ 08 августа 2010

gcc 4.4.4 c89

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

Я получаю вышеупомянутые предупреждения с кодом ниже.То, что я пытаюсь сделать, это получить информацию от пользователя.И назначить этот массив символов массиву указателей.Таким образом, мой массив указателей будет содержать все введенные устройства.Тем не менее, я получаю 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++);
    }
}

Ответы [ 4 ]

3 голосов
/ 08 августа 2010

Вы разыменовываете нулевой указатель.Ничего хорошего из этого не выйдет:

char** devices = NULL;

инициализирует указатель на NULL.Он никогда не устанавливается на что-либо другое, а затем разыменовывается (дважды).

Указатели считаются сложными, и их довольно сложно использовать, если кто-то не совсем точно понимает, что он / она делает.Я думаю, что в вашем сценарии есть два варианта.Вы можете хранить имена в одном массиве char, расположенном рядом с другим, и сохранять массив указателей, указывающих на начало этих имен, или вы можете использовать массив char массивов (двумерный массив) для хранения имен ".отдельно "каждый в другом массиве.Я думаю, что второй способ намного проще, и вы должны начать с его работы.

Вы можете определить массив следующим образом

#define NUM_OF_NAMES 3

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

сейчас devices[0], devices[1] и devices[2] все char массивы типа char[DEVICE_SIZE]. Вы можете использовать каждый из них, как и ранее, как буфер.

3 голосов
/ 08 августа 2010

Даже если вы исправите ошибки компилятора (как описано другими), то, что вы пытаетесь сделать, не будет работать. Вы звоните fgets() на один и тот же device_array каждый раз, поэтому каждый раз, когда он вызывается, он будет перезаписывать то, что было там ранее.

Возможные решения включают использование нескольких символьных массивов (например, char device_buff[3][DEVICE_SIZE]) или одного длинного массива и продвижение указателя при каждом вызове fgets().

3 голосов
/ 08 августа 2010

**devices - это символ, device_buff - это массив символов. Два типа несовместимы.

1 голос
/ 08 августа 2010

Вы должны использовать динамическое или предопределенное распределение для вашего буфера-массива. Конечный маркер в этом примере - пустая строка, а не 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++);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...