【问题标题】:C pointer to pointer warningC指针指针警告
【发布时间】:2019-01-03 09:15:48
【问题描述】:

当我指向一个指针时,我得到一个警告。我不知道为什么;类型相同。

char delay_buffer1[40];
char delay_buffer2[40];
char** delay_buffer_front;
delay_buffer_front = &delay_buffer1;

目标是交换缓冲区:

void swap_string_buffer(void** pointer, void* buffer1, void* buffer2) {
  printf("pointer: %u. buffer1: %u. buffer2 %u\n", pointer, buffer1, buffer2);
  if(*pointer == buffer1) *pointer = buffer2;
  else *pointer = buffer1;
}

示例代码:

copy_content_to(delay_buffer_front);
swap_string_buffer((void**) delay_buffer_front, (void*) delay_buffer1,(void*)delay_buffer2);
fprintf(file, "%s", delay_buffer_front);

警告:来自不兼容指针类型的赋值 [-Wincompatible-pointer-types] delay_buffer_front = &delay_buffer1;

【问题讨论】:

  • "类型相同。"不完全正确。指向指针的指针与指向数组的指针的类型不同。
  • delay_buffer1 == &delay_buffer1 = &delay_buffer1[0]
  • 你怎么称呼swap_string_buffer?请显示代码小minimal reproducible example
  • ...delay_buffer_front 的目的是什么?请解释swap_string_buffer 到底应该做什么。显示具有预期输出的minimal reproducible example
  • ...但是它应该做什么???请展示一个完整示例,说明所有缓冲区的内容应该是之前之后调用swap_string_buffer

标签: c pointers warnings


【解决方案1】:

类型相同。

不,他们不是。您可能对以下事实感到困惑(这很常见),数组的标识符在几乎所有上下文中都会评估为指向其第一个元素的指针(例外情况是,例如运算符&sizeof)。

但这并不能改变数组是数组而指针是指针的事实

这是一个指向指针的指针

char **delay_buffer_front;

您可能想要的是一个指向数组的指针

char (*delay_buffer_front)[40];

或者您可能只是想要一个指向数组第一个元素的普通指针:

char *delay_buffer_front;

使用该声明,您可以只分配数组的标识符,因为如上所述,它计算为这样一个指针:

char *delay_buffer_front = delay_buffer1;

【讨论】:

  • 赞成指针和数组的区别。不过,char (*buf)[40] 语法看起来很伤人。这看起来就像我在第一次认真的 C 设计中犯的一个错误,我是 C 的新手,并在 1984 年左右将应用程序从 Pascal 转换为 C。 “指向数组的指针”是在 Pascal 中使用的一种自然数据类型,但在 C 中通常是一种符号负担。
【解决方案2】:

就是说,这两个指针不兼容。这更像是一个错误而不是一个警告。

你可能想要这个:

char* delay_buffer_front;
delay_buffer_front = delay_buffer1;

代替:

char** delay_buffer_front;
delay_buffer_front = &delay_buffer1;

【讨论】:

    【解决方案3】:

    您想要的只是交换缓冲区,您不必创建指向指针的指针。只需创建一个类似类型的中间指针并将其用于交换即可。

    char* delay_buffer_front; //Intermediate pointer to store the address of first buffer
    delay_buffer_front = delay_buffer1; //Store the address of the first buffer in the 
                                        //intermediate pointer.
    

    【讨论】:

      猜你喜欢
      • 2016-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多