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

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

我使用如下代码出现了上述警告。我的目标是从用户那里获取输入,并将该字符数组分配给指针数组。因此,我的指针数组将包含所有输入的设备。但是,在这行代码上我遇到了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

您正在取消引用空指针。这样做不会有任何好处。

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[DEVICE_SIZE]char数组。你可以像之前使用缓冲区那样使用它们。


“如果一个人不完全理解自己在做什么,那么使用它们几乎是不可能的。”——有点像整数吧?不,它们并不“难”。 - anon
@Neil 就像整数一样,如果我们谈论专业编程,但您必须承认,在这里经常看到的程序员新手中,整数和指针之间存在差异。在他们的情况下,仅使用整数的程序有相当高的机会可以正常工作。指针需要更多的猴子和更多的时间。从这个意义上说,它们更难。 - Maciej Hehl

3

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


3
即使您修复编译器错误(如其他人所述),您试图做的事情也不会起作用。您每次调用fgets()时都在同一device_array上调用,因此每次调用它时,它都会覆盖先前存储的内容。
可能的解决方案包括使用多个字符数组(例如char device_buff[3][DEVICE_SIZE])或一个长数组,并在每次调用fgets()时推进指针。

1
你必须为缓冲区数组使用动态或预定义分配。 示例中的结束标记是一个空字符串,而不是一个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++);
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接