C 函数能否返回作为限制指针的参数?

C 函数能否返回作为限制指针的参数?,c,pointers,restrict-qualifier,C,Pointers,Restrict Qualifier,假设我有一个函数,它接受两个无别名的int*,并将一个int复制到另一个,然后返回作为目标的int*。 例如: int*copy\u int(int*restrict dest,int const*restrict src){ *dest=*src; 返回目的地; } 以下调用代码是否有未定义的行为 void调用方(void){ int dest; int src=42; copy_int(&dest,&src);//忽略返回值别名&dest } void调用方(void){ int des

假设我有一个函数,它接受两个无别名的
int*
,并将一个
int
复制到另一个,然后返回作为目标的
int*
。 例如:

int*copy\u int(int*restrict dest,int const*restrict src){
*dest=*src;
返回目的地;
}
以下调用代码是否有未定义的行为

void调用方(void){
int dest;
int src=42;
copy_int(&dest,&src);//忽略返回值别名&dest
}
void调用方(void){
int dest;
int src=42;
int*dest\u addr=copy\int(&dest,&src);//dest\u addr别名和dest
}
void调用方(void){
int dest;
int src=42;
int*dest_addr=&dest;
int*dest_addr_2=copy_int(&dest,&src);//dest_addr_2别名dest_addr
}

或者我可以安全地假设
restrict
仅适用于被调用方内部,并且我可以在函数调用外部别名这些指针吗?

restrict
适用于函数可以假设的内部
copy_int(int*restrict dest,int const*restrict src)
,从而产生更好的优化代码。调用方必须传递不与数据重叠的地址

所有案例在这方面都做相同的事情:
copy\u int(&dest,&src)
dest
src
彼此没有别名。OP显示的混叠情况不影响
dest、src

下面是错误代码的示例

copy_int(&src, &src);  // bad

FWIW,
restrict
的正式定义见C标准第6.7.3.1节。另一个有趣的地方是,您的
copy\u int
函数具有类似的签名,并且返回行为(返回目标指针)与标准库函数
memcpy
相同。我从来没有听说过对
memcpy
@user3386109返回值的使用有任何限制是的,它是相似的。既然如此,为什么
memcpy
的参数没有限制限定符呢?文件规定,存储区域不得重叠,这是更严格的要求。C11规范第7.24.2.1节中
memcpy
的签名为
void*memcpy(void*restrict s1,const void*restrict s2,size_t n)也就是说它的参数上有限制限定符。你说得对,我刚刚检查了标准。奇怪的是,我电脑的手册页不准确。也许是因为它在C99之前都不合格?