这个C片段做了什么

时间:2018-02-22 21:45:51

标签: c

我试图用评论来弄清楚,但不确定我的直觉是否正确。

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;
}

2 个答案:

答案 0 :(得分:7)

通过考虑参数's'中通知的数字,代码的意图是以愚蠢多元化(附加s)在参数n中通知的单词。换句话说(如果代码是正确的),如果n > 1,则它会在字符串的末尾附加s

但是,由于存在许多错误,所提供的代码将无效:

  1. 假设在s中通知的字符串不会超过8个字符(8 +''+'\ 0'),否则该函数可能会使进程崩溃或导致其他不良影响 - 您应该使用更安全的函数来执行字符串复制;
  2. 用于将指针移动到字符串末尾的循环,使指针递增,直到为时已晚。它在\0(nul终止符)之后停止,因为尽管条件的结果,总是执行后增量运算符(++)。它应该是while (*c) c++;;
  3. 它返回一个指向本地变量s2的无效指针,这可能会导致程序中出现多个问题,包括崩溃 - 您应该为结果动态分配内存,或者将指针作为参数传递,指示将存储字符串,以及它可以占用多少字节;
  4. 它不会正确终止新字符串 - 不能保证字符串在附加's'后会包含另一个'\ 0'。

答案 1 :(得分:1)

您提供的代码段是一个非常糟糕的编码示例。它有很多问题:

  • 对象s2被声明为一个有限大小为10的本地数组,它作为参数传递给strcpy()而没有任何边界检查,这为可能的溢出打开了大门。 / LI>
  • 如果参数n的值大于1,则字符串的终止字符将替换为's',如果使用不正确,可能会导致未定义的行为,例如传递给像printf()

  • 这样的函数
  • 它返回一个局部变量的地址,如果取消引用则会产生未定义的行为。