2015-08-28 96 views
0

下面是我的代码示例。我想创建动态字符数组来存储字符串。使用malloc分配动态内存

这里是我的代码

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

    int main(void) 
    { 
     int i , j , n; 
     char *ptr; 
     printf("enter number of elements \n"); 
     scanf("%d",&n); 
     ptr = (char *) malloc((n + 1)*sizeof(char)); 
     for (i = 0;i< n;i++) 
     { 
     scanf("%c",&ptr[i]); 
     } 
     for (i = 0;i <n; i++) 
     { 
     printf("at %d is %c\n",i,*(ptr + i)); 
     } 
     free(ptr); 
    } 

但是当我尝试编译并运行此代码,没有字符被分配到由指针指向p内存。

这里是我的程序的输出:

[email protected] (~/c): ./test2 
enter number of elements 
8 
asdfghjk 
at 0 is 
at 1 is a 
at 2 is s 
at 3 is d 
at 4 is f 
at 5 is g 
at 6 is h 
at 7 is j 
+3

请[不要施放malloc的结果](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc?lq=1)。 – Martin

+2

请注意'sizeof(char)'总是1,所以你可以用'ptr = malloc(n + 1);'替换分配。 – user694733

+0

作为int main(),你应该至少返回0到0结尾 –

回答

3

%cscanf前留出空间 -

scanf(" %c",&ptr[i]); 

因为会有'\n'留在缓冲区中的第scanf为后n当您在n的值后按ENTER

而且您不需要施放malloc的结果。

至于什么马特·麦克纳布爵士在他的评论中说,对于你能做到这一点 -

scanf("%*c%c",&ptr[i]); 

%*c会照顾'\n'如果仅仅space被击中甚至不会跳过。

+0

他可能想要输入空格并将它们计数 –

+0

@MattMcNabb请参阅编辑Sir。我系列以涵盖您的观点。 – ameyCU

+1

实际上,整个循环应该由'fgets(ptr,n + 1,stdin);'替代。 –