c - 如果它们是结构的成员,可以比较 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。但是,我的教授在课堂上问我们什么没有问题
- p[0].p0 < p[0].p1
- p[1].p0 < p[1].p1
- 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 存储的地址(这是在堆上分配的空间的地址)。
我不知道,我想不出任何其他解释
- 我的教授对上述3种表达方式的回答
- 我在我的机器上运行 3 个表达式确认了答案
按照惯例,我会认为答案是未定义的。只要将指针存储在结构中,比较指针是否存在某种异常?否则为什么我的教授会。将此作为我们的测验/测试问题?
解决方案
推荐阅读
- java - 通过 XML 配置 Spring Ehcache 3.x
- scala - 扫描系统 PATH 以获取可执行文件
- python-3.x - 分配元素后的scrapy xpath提取文本
- c# - 在 listview winform c# 中列出 S3 Bucket 键
- javascript - 在下拉列表中的 0 索引上插入值
- java - OnTouchListener webview 总是循环
- javascript - React-Native Javascript 搜索过滤功能
- python - 如何在数据框中纠正拼写错误的单词?
- r - 以最小距离连接矩阵的两个坐标
- visual-studio-code - VSCode,Intellisense C++ 自动完成功能不起作用,ubuntu 20.04