【问题标题】:Pointer function returning false value指针函数返回假值
【发布时间】:2017-09-05 15:25:31
【问题描述】:

我写了一个这样的函数,当参数 x 甚至它不能按预期工作时,例如,如果我在 main 中键入 printf("%s",maxCharac(2)),它会在它旁边打印 aa 和一个额外的字符,但是有一个奇数它工作正常。

char *maxCharac(int x)
{
    char *str=(char*)malloc(sizeof(char)*x);
    for(int i=0;i<x;i++)
    {            
        str[i]='a';
    }
    return str;   
}

【问题讨论】:

标签: c function-pointers


【解决方案1】:

你没有为你的字符串分配足够的内存,因为你需要一个额外的字符来终止它,所以你想像这样分配一个额外的 并确保最后一个字符是 NUL。

char *str=(char*)malloc(sizeof(char)*(x+1));
for(int i=0;i<x;i++){  
   str[i]='a';
}

str[x]='\0';

如果末尾没有额外的 NUL 字符,您将遇到未定义的行为 - 您的代码将继续读取字符串末尾之外的内容,直到遇到 NUL 字符。当x 在正确的位置终止您的字符串时,您会看到一个奇数,这纯属运气。

【讨论】:

  • 严格来说c 的演员阵容不需要malloc return。
  • 不要转换malloc的返回值。 sizeof(char)根据定义始终为 1。
  • @LPs 我知道这不是必需的,但它在原始代码中,所以我把它留在里面,只更正了绝对错误的部分
  • @SinanÜnür 在代码中明确说明它并没有什么坏处,即使它总是 1 - 实际上它应该是 sizeof(*str),因为这样可以确保它始终是 @ 的正确类型987654329@
【解决方案2】:

C 字符串被NUL 终止,所以

char *maxCharac(int x)
{
    char *str = malloc(x + 1);

    if (str != NULL)
    {
       for (int i = 0; i < x; i++)
       {
          str[i] = 'a';
       }
       str[i] = '\0';
    }

    return str;
}

如你所见:

  1. 您必须为空终止符留出空间 '\0' malloc(x + 1);
  2. sizeof(char) 始终为每个标准 1 个
  3. 必须在使用前检查malloc&amp;co 返回值!= NULL

或者,为了避免最后一条指令,您可以使用 calloc 将分配的内存归零

char *maxCharac(int x)
{
    char *str = calloc(x + 1, 1);

    if (str != NULL)
    {
       for (int i = 0; i < x; i++)
       {
          str[i] = 'a';
       }
    }

    return str;
}

最后,根据函数,调用者必须检查函数的返回值,以确保不使用可能返回的 NULL 指针:

int main(void)
{
    char *str = maxCharac(2);

    if (str != NULL)
    {
        printf("Test: %s\n", str);
    }   
}

【讨论】:

  • @SinanÜnür 感谢您的编辑,对不起我的英语;)
猜你喜欢
  • 2018-03-07
  • 1970-01-01
  • 2013-04-10
  • 2014-08-03
  • 2018-05-30
  • 2018-08-19
  • 2011-12-06
  • 2014-08-16
相关资源
最近更新 更多