繁体   English   中英

我可以在此功能中使用限制限定符吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM