我做了一个关于将输入放到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);
}
答案 0 :(得分: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);
答案 1 :(得分:2)
由于你在循环中增加buffer
的值,循环后的代码是错误的。您不能free()
增加buffer
,它将指向malloc()
尚未返回的地址。
基本上你在做:
char *buffer = malloc(25);
...
free(buffer + length of string the user entered);
这意味着您传递给free()
的地址不再与malloc()
返回的地址相同,这是一个错误。
答案 2 :(得分:0)
你的另一个问题是:
*buffer++ = chara;
printf("%c\n",*buffer);
打印出垃圾 - 您将chara
分配到buffer
指向的位置,增加buffer
,然后打印出buffer
现在指向的(未初始化的)位置
只需打印chara
。