2017-04-10 162 views
-4

我写这样的函数,当参数x是即使我在主输入printf("%s",maxCharac(2))它会打印AA和一个额外的字符旁边不作为期望的工作,例如,但是奇数时它可以正常工作。指针函数返回值为false

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

[请参阅为什么不投的malloc''中的C'返回值()'和家人讨论](http://stackoverflow.com/q/605845/ 2173917)。 –

+4

你必须null结束它。在'for'循环后添加这行,并在'malloc'行中加上'+ 1'。 'str [x] = NULL;' – imreal

+1

你的字符串必须是null-termante,所以你需要在字符后加一个额外的字节。 – LPs

回答

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. sizeof(char)永远是1元的标准
  3. 必须检查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); 
    } 
} 
+0

@SinanÜnür感谢您的编辑并对我的英语感到抱歉;) – LPs

2

你是不是为你的字符串分配足够的存储空间,你需要一个额外的字符空终止它,所以你要分配一个额外这样 并确保最后一个字符是一个NUL 。

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

str[x]='\0'; 

结尾没有多余的空字符,您遇到不确定的行为 - 你的代码会继续读超过字符串的结尾,直到它遇到一个NULL字符。你看到一个x在正确的点终止你的字符串是奇怪的是纯粹的运气。

+0

严格地说[tag:c]说'malloc'返回是不需要的。 – LPs

+0

请勿施放'malloc'的返回值。 'sizeof(char)'***根据定义***总是1. –

+0

@LPs我知道这不是必需的,但它是在原始代码中,所以我把它留在原来的位置,只纠正那些肯定错误的部分 –