我有以下一行:
sprintf(someString,"%s%s",someString,someOtherString);
编译器给我以下警告:
//someFile.c:277:15: error: passing argument 1 to restrict-qualified parameter aliases with argument 3 [-Werror=restrict]
我想用不会给我编译错误的东西替换该行。我用错误搜索了一下,并了解了受限指针,这是我的解决方案:
strcat(someString, someOtherString);
这是否提供相同的功能?在我的测试中确实如此,但是我不想在某些情况下破坏代码的功能。
答案 0 :(得分:4)
您应将strcat
与足够大的目标数组一起使用。
将sprintf
与目标相同的数组和%s
的字符串参数一起使用具有未定义的行为。大多数现有的实现都将针对问题中的特定情况产生预期的结果,但是C标准使其明确未定义。
编译器正确地抱怨警告可能很难破译:
passing argument 1 to restrict-qualified parameter aliases with argument 3
这意味着参数3与参数1指向的数组重叠,如果对参数3指向的数组进行了取消引用,这是不正确的,因为它将别名化通过声明为restrict
的参数1取消引用的内存。 sprintf
原型中的指针,表示没有其他指针可以读写通过它访问的内存。
如果sprintf(someString, "%.0s%s", someString, someOtherString);
符合someOtherString
,则someString
这样的极端情况将定义行为,因为未取消引用参数3,但编译器仍会发出警告。
答案 1 :(得分:3)
使用sprintf
打印到与源之一相同的字符串中是未定义的行为。您可以sprintf
打印到第三个字符串,但是无论如何strcat
都会表现得更好,因为它不必解析格式字符串并进行额外的复制。在这两种情况下,您都需要确保someString
中有足够的空间来容纳someOtherString
的内容。