问:
如果我有两个指针(本质上是一个begin
和end
),它有资格与restrict
。指针begin
用于解引用/读取,而指针end
是一个永远不会被解除引用的单指针指针,仅用于检查范围的大小(通过end - begin
)。一旦范围被消耗,我预计begin
和end
是相等的,并且end - begin
为0,尽管此时两个指针永远不会被解除引用。我可以减去或比较受限制的指针吗?
鉴于restrict
对指针的限制,是否定义明确的行为来减去并比较这两个指针?
MVCE:
我有这样一些代码如下:
#include <stddef.h>
struct Reader {
const char* restrict data;
size_t size;
};
char read_char(struct Reader* reader) {
--reader->size;
return *reader->data++;
}
int main(int argc, char* argv[]) {
struct Reader reader = {
.data = argv[1],
.size = argv[1] ? strlen(argv[1]) : 0,
};
if (reader.size > 0) {
return read_char(&reader);
}
return 0;
}
我想改变它,以便而不必阅读时,只data
需要修改这两个data
和size
的被修改:
#include <stddef.h>
struct Reader {
const char* restrict data;
const char* restrict end; // Not sure if this should be restrict or not.
};
char read_char(struct Reader* reader) {
return *reader->data++;
}
int main(int argc, char* argv[]) {
struct Reader reader = {
.data = argv[1],
.end = argv[1] + (argv[1] ? strlen(argv[1]) : 0),
};
if (reader.end - reader.data > 0) { // Is this okay?
return read_char(&reader);
}
return 0;
}
这是允许的,因为restrict
对指针的限制?
可能重复[在某些情况下可以使用限制指针访问同一对象吗?](http://stackoverflow.com/questions/18059205/can-you-use-restrict-ed-pointers-to - 在某些情况下访问相同的对象) – LPs
@LPs:我的问题不同。我不想通过别名指针访问同一个对象。 'end'指针永远不会被取消引用,并且唯一的时候'data'和'end'别名是相等的(在这一点上,取消引用或者是不确定的行为)。我的问题是关于比较两个不同的指针。 – Cornstalks
进入建议的副本显示,只要您不修改指出的对象的行为被定义。可能我错过了一些东西...... – LPs