我编写了这样的函数,当参数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;
}
答案 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;
}
如你所见:
'\0'
malloc(x + 1);
sizeof(char)
每个标准始终为1 malloc&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);
}
}
答案 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}}在正确的位置奇怪地终止你的字符串时你会看到一个是纯粹的运气。