[英]Can I use restrict qualifier in this function?
我阅读了标准,但仍然不能确定:
#include <stdio.h>
#include <string.h>
void repl(char *restrict ap){
char *cp=strchr(ap,(int)'m');
*cp='M';
}
int main(){
char arr[] = "example";
repl(arr);
puts(arr);
return 0;
}
在repl
函数中,我使用strchr
获得了另一个用于修改对象的指针。 我希望结果是第一个m
替换为M
的字符串。
但这可能是未定义的行为吗?
如果是,那么使用ap[cp-ap]='M';
怎么办ap[cp-ap]='M';
而不是*cp='M';
?
别名规则允许通过其自己的类型或字符类型(包括其有符号/无符号变体)访问任何变量。 这意味着*cp='M';
是指定的行为,不需要任何特殊的预防措施,因为*cp
是字符类型。
在一个不同的主题,你不需要投'm'
在(int)'m'
为'm'
的类型已经int
在C.
这不是未定义的行为,因为指针cp是从指针变量ap派生的。
编译器如何知道cp源自ap? 不必知道。 首先,编译器是否知道不会更改行为是已定义还是未定义。 规则不是“如果编译器知道...”,而是“如果cp是从ap派生的”。
只要编译器无法证明cp不是从ap派生的,它就必须提供与您未使用limit关键字完全相同的语义。
我的印象是您误解了restrict
修饰符的目的。 这是函数调用者必须提供的保证,即该对象不能通过任何其他指针访问,并且不会通过使用这样的另一个指针进行意外修改。 因此, 使用 restrict
限定指针不会导致UB。
另外,在您的情况下,您正在将这样的指针传递给函数。 此后,编译器再也不能假定指针没有别名,例如,指向全局变量或函数返回的指针。 (实际上是这样)
举个例子,不是具有UB的memcpy
函数。 但是,如果两个指针指向重叠的对象,那将是您尚未定义行为的memcpy调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.