将char缓冲区分配给指针数组

时间:2010-08-08 16:54:55

标签: c pointers

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++);
    }
}

4 个答案:

答案 0 :(得分:3)

**devices是一个char,device_buff是一个char数组。这两种类型是不兼容的。

答案 1 :(得分:3)

您正在取消引用空指针。

可以带来什么好处
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]数组。您可以使用它们中的每一个,就像之前的缓冲区一样。< / p>

答案 2 :(得分:3)

即使您修复了编译器错误(如其他人所述),您尝试执行的操作也无法正常工作。您每次都在fgets()调用device_array,因此每次调用它时,它都会覆盖之前存储的内容。

可能的解决方案包括使用多个字符数组(例如char device_buff[3][DEVICE_SIZE])或一个长数组,并在每次调用fgets()时推进指针。

答案 3 :(得分:1)

您必须为Buffer-ARRAY使用动态或预定义分配。 示例中的Endmarker是一个空字符串而不是NULL-Pointer。

#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++);
  }
}