首页 > 解决方案 > 如果它们是结构的成员,可以比较 C 中的指针吗?

问题描述

例如:

struct A {
  char *p0;
  char *p1;
}

int main(int argc, char **argv){
   char a=0;
   char *b="W";
   char c[]=['L','O','L',0];

   struct A p[3];
   p[0].p0=&a;
   p[1].p0=b;
   p[2].p0=c;

   for(int i=0;i<3;i++){
     p[i].p1=malloc(10);
     strcpy(p[i].p1, p[i].p0);
   }


我在其他地方读到过指针比较是不安全的,除非被比较的指针指向同一个数组、内存块或数组后面的 1。但是,我的教授在课堂上问我们什么没有问题

  1. p[0].p0 < p[0].p1
  2. p[1].p0 < p[1].p1
  3. p[2].p0 < p[2].p1

评价为。答案是 0、1 和 0。

我在理论上p[0].p0<p[1].p1计算结果为 0,因为p[0].p0指向 char a 的内存位置,该位置存储在堆栈上,该堆栈具有比堆上空间p[0].p1指向的更高的内存地址。这也是我认为表达式p[2].p0 < p[2].p1计算为 0 的原因,因为p[2].p0将第一个元素的内存位置存储在 char 数组 char[] c 中,它在堆栈上,而p[2].p1指向在堆上分配的一些空间(因此是较低的内存地址) .

但是,p[1].p0 < p[1].p1计算结果为 1,因为当char *声明指向字符串文字时,字符串文字存储在全局/静态变量和虚拟内存空间的代码部分中的某处的堆下方。因此它存储的地址低于 p[1].p1 存储的地址(这是在堆上分配的空间的地址)。

我不知道,我想不出任何其他解释

  1. 我的教授对上述3种表达方式的回答
  2. 我在我的机器上运行 3 个表达式确认了答案

按照惯例,我会认为答案是未定义的。只要将指针存储在结构中,比较指针是否存在某种异常?否则为什么我的教授会。将此作为我们的测验/测试问题?

标签: cpointersmallocheap-memorypointer-arithmetic

解决方案


推荐阅读