函数返回意外值

时间:2017-08-15 15:46:11

标签: c arrays string output

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

3 个答案:

答案 0 :(得分:3)

C中的字符串需要在结尾处以NUL('\0')字符终止,因此您总是需要分配一个额外的空间来存储它。以下是您的代码已更正以解决此问题。

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

答案 1 :(得分:1)

您正在尝试将字符数组作为字符串输出(由零字符终止的字符序列),而数组不包含字符串。

要么输出固定数量的字符数组元素。或者你应该在字符数组中存储一个字符串。

例如

#include <stdio.h>
#include <stdlib.h>

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

    return str;   
}

int main(void) 
{
    const int N = 10;

    for ( int i = 1; i < N; i++ )
    {
        char *s = maxCharac( i );
        printf( "%*.*s\n", i, i, s );

        free( s );
    }       

    return 0;
}

程序输出

a
aa
aaa
aaaa
aaaaa
aaaaaa
aaaaaaa
aaaaaaaa
aaaaaaaaa

或者

#include <stdio.h>
#include <stdlib.h>

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

    str[i] = '\0';

    return str;   
}

int main(void) 
{
    const int N = 10;

    for ( int i = 1; i < N; i++ )
    {
        char *s = maxCharac( i );
        printf( "%s\n", s );

        free( s );
    }       

    return 0;
}

程序输出

a
aa
aaa
aaaa
aaaaa
aaaaaa
aaaaaaa
aaaaaaaa
aaaaaaaaa

答案 2 :(得分:0)

如@Chris Turner所述,您应该使用\0

终止字符串

或者,您也可以使用calloc来分配内存而不是malloc,因为calloc通过将其设置为零来返回内存