我对C编程中的这个函数原型有疑问
char *strncat( char *s1, const char *s2, size_t n )
为什么第一个参数不是const而第二个参数是const?
int main(void)
{
char *nameOne;
char nameTwo[11];
char *pName = nameTwo;
nameOne = "Moe Howard";
strcpy(pName, "Larry Fine");
strcat(nameOne,"shirin");
printf("%s",nameOne);
return 0;
}
它不起作用 任何提示?
答案 0 :(得分:2)
因为strncat需要写入(s1)指向的字符缓冲区;但它只需要从(s2)指向的字符缓冲区中读取。
答案 1 :(得分:2)
人们经常误以为是什么
const char *s2;
实际上意味着。它是非常量指针到常量字符。这意味着您不允许更改实际角色"背后"指针,虽然你可以将指针本身移动到你想要的任何地方(const char * const xyzzy;
将字符和锁定到指向不变值的指针,char * const xyzzy;
将锁定指针但允许你要改变它指向的角色。)
这就是为什么第一个参数是char *
- 将另一个(源)字符串连接到它的行为意味着您必须更改目标字符串的基础字符。
因为您根本不需要修改源字符串,所以可以const
。
您发布的代码不起作用的原因在于:
nameOne = "Moe Howard";
:
strcat (nameOne, "shirin");
您不能修改nameOne
指向的字符串文字(嗯,可能可以工作,但不能保证)。这在C11 6.4.5 String literals /7
中有具体指出,它讨论了C字符串包含的字符数组:
如果这些数组的元素具有不同的数据,则未指定 适当的价值观如果程序试图修改这样的数组,则行为是 未定义。
之所以如此,主要是因为编译器优化了字符串文字。例如,代码:
char *s1 = "defined";
char *s2 = "undefined";
可能导致以下内存布局,包含两个变量" sharing"基础数据:
+------------------------------ s1
|
v
+---+---+---+---+---+---+---+---+---+----+
| u | n | d | e | f | i | n | e | d | \0 |
+---+---+---+---+---+---+---+---+---+----+
^
|
+-------------------------------------- s2