1

我做了一个关于将输入输入到 char 指针的测试用例。当我尝试运行该程序时,输出不正确(它变成了一系列随机字符,例如:_ @$)。我打算打印该 char 指针中的每个元素。我对我的代码进行了一些更改,但它仍然是错误的(与以前相同的问题)。有人可以帮我找出问题所在以及解决方法吗?

int chara;
int counts =0;

main(){

    char *buffer=(char *)malloc(sizeof(char)*25);
    while((chara=getchar())!= EOF&& counts<25){
        *buffer++ = chara;
        printf("%c\n",*buffer);
        counts++;

    }
    *buffer = '\0';
     printf("%s\n",buffer);
     free(buffer);
}
4

3 回答 3

2

修改您的代码。

    int chara; //getchar() returns int
    int i=0;
    char *buffer=malloc(20); //allocate correctly
    while(  ( (chara=getchar())!= EOF) && ( i!=19 ) ) { //check against EOF and check counter value to avoid input with legth greater than allocated size.
        buffer[i]= chara;   
        //use indexing with counter variable to avoid errors with free()
        // if change pointer you can't free() memory  
         printf("%c\n",buffer[i++]);
    }

    buffer[i] = '\0';
     printf("%s\n",buffer);
     free(buffer);
于 2013-10-08T16:40:52.030 回答
2

由于你在循环中增加了 的值,buffer所以循环之后的代码是错误的。你不能free()递增buffer,它将指向一个尚未返回的地址malloc()

基本上你在做:

char *buffer = malloc(25);
...
free(buffer + length of string the user entered);

这意味着您传递给的地址free()不再与返回的地址相同malloc(),这是一个错误。

于 2013-10-08T17:00:05.890 回答
0

你的另一个问题是:

    *buffer++ = chara;
    printf("%c\n",*buffer);

打印出垃圾——你分配chara给 where bufferis pointing , increment buffer,然后打印出现在指向的(未初始化的)位置buffer

只需打印chara即可。

于 2013-10-08T17:20:51.177 回答