C指针指向指针警告

C pointer to pointer warning

当我指向指针时收到警告。我不确定为什么;类型相同。

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

objective 是交换缓冲区:

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

warning: assignment from incompatible pointer type [-Wincompatible-pointer-types] delay_buffer_front = &delay_buffer1;

就是说,这两个指针是不兼容的。与其说是警告,不如说是错误。

你可能想要这个:

char* delay_buffer_front;
delay_buffer_front = delay_buffer1;

而不是:

char** delay_buffer_front;
delay_buffer_front = &delay_buffer1;

the types are the same.

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

但这并没有改变数组是数组,指针是指针的事实

这是一个指向指针的指针:

char **delay_buffer_front;

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

char (*delay_buffer_front)[40];

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

char *delay_buffer_front;

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

char *delay_buffer_front = delay_buffer1;

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

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.