指针函数返回false值

时间:2017-04-10 14:17:25

标签: c function-pointers

我编写了这样的函数,当参数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;   
}

2 个答案:

答案 0 :(得分:3)

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. 留出空间
  3. sizeof(char)每个标准始终为1
  4. 在使用之前,必须检查malloc&co返回值!= NULL
  5. 或者,为避免上一条指令,您可以使用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);
        }   
    }
    

答案 1 :(得分:2)

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

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

str[x]='\0';

在最后没有额外的NUL字符时,您遇到了未定义的行为 - 您的代码将继续读取字符串的结尾,直到遇到NUL字符。 <{1}}在正确的位置奇怪地终止你的字符串时你会看到一个是纯粹的运气。