【问题标题】:assigning a char buffer to an array of pointers将 char 缓冲区分配给指针数组
【发布时间】:2010-08-08 16:54:54
【问题描述】:

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

【问题讨论】:

    标签: c pointers


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      即使您修复了编译器错误(如其他人所述),您尝试执行的操作也不起作用。您每次都在同一个device_array 上调用fgets(),因此每次调用它都会覆盖之前存储在那里的内容。

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

      【讨论】:

        【解决方案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] 的数组。您可以使用它们中的每一个,就像之前的缓冲区一样。

        【讨论】:

        • “如果一个人不完全理解他/她在做什么,就不可能使用它们” - 有点像整数吗?不,它们并不“硬”。
        • @Neil 就像整数一样,如果我们谈论专业编程,但你必须承认,对于我们一直在这里看到的大量程序员崇拜者来说,整数和指针之间存在差异。在他们的案例中,仅使用整数的程序有很高的工作机会。指针需要更多的猴子和更多的时间。从这个意义上说,它们更难。
        【解决方案4】:

        您必须为 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++);
          }
        }
        

        【讨论】:

          猜你喜欢
          • 2018-10-06
          • 2011-04-02
          • 1970-01-01
          • 2015-10-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-23
          相关资源
          最近更新 更多