我试图用评论来弄清楚,但不确定我的直觉是否正确。
char *foo(char *s, int n)
{
char s2[10]; /* Create a empty string of size 10 */
char *c; /* Declare a pointer to a char */
strcpy(s2, s); /* Copy s into s2 */
c = s2; /* Set c equal to the beginning of s2 */
while(*c++); /* Move c to the end of s2 */
*c = (n > 1) ? 's' : 0; /* If argument is greater than 1 change last char to a s, otherwise 0 */
return s2;
}
答案 0 :(得分:7)
通过考虑参数's'
中通知的数字,代码的意图是以愚蠢多元化(附加s
)在参数n
中通知的单词。换句话说(如果代码是正确的),如果n > 1
,则它会在字符串的末尾附加s
。
但是,由于存在许多错误,所提供的代码将无效:
s
中通知的字符串不会超过8个字符(8 +''+'\ 0'),否则该函数可能会使进程崩溃或导致其他不良影响 - 您应该使用更安全的函数来执行字符串复制; \0
(nul终止符)之后停止,因为尽管条件的结果,总是执行后增量运算符(++)。它应该是while (*c) c++;
; s2
的无效指针,这可能会导致程序中出现多个问题,包括崩溃 - 您应该为结果动态分配内存,或者将指针作为参数传递,指示将存储字符串,以及它可以占用多少字节; 's'
后会包含另一个'\ 0'。答案 1 :(得分:1)
您提供的代码段是一个非常糟糕的编码示例。它有很多问题:
s2
被声明为一个有限大小为10的本地数组,它作为参数传递给strcpy()
而没有任何边界检查,这为可能的溢出打开了大门。 / LI>
如果参数n
的值大于1,则字符串的终止字符将替换为's'
,如果使用不正确,可能会导致未定义的行为,例如传递给像printf()
。
它返回一个局部变量的地址,如果取消引用则会产生未定义的行为。