user-0 提问: malloc的使用

回复:
user: user-1
content: 申请空间也不要放在循环内吧

user: user-2
content: 楼主想自由分配动态内存，不用既定内存

user: user-2
content: 就没人想到realloc吗………

user: user-3
content: 引用 13 楼 weixin_42045178 的回复:哦哦哦，我明白了，谢谢指导。  前面的那个文字密密麻麻的回复，建议仔细看看吧，虽然都是很基础的东西，但是还是觉得很有用处的。 另外，麻烦结个帖给分吧，谢谢！

user: user-0
content: 引用 11 楼 儿童节的回复:[quote=引用 8 楼 weixin_42045178 的回复:] 也不行，如果是1的话就会无限循环 输入一个不是数字的字符，比如字母a进去就结束了。[/quote] 嗯嗯，知道了，谢谢。

user: user-0
content: 哦哦哦，我明白了，谢谢指导。

user: user-3
content: 引用 8 楼 weixin_42045178 的回复:也不行，如果是1的话就会无限循环  malloc的参数也写大一点，sizeof(int)只有4个字节，名以上只分配了4个字节任意使用空间，只够输入 1 个 int 型的值 。

user: user-3
content: 引用 8 楼 weixin_42045178 的回复:也不行，如果是1的话就会无限循环 输入一个不是数字的字符，比如字母a进去就结束了。

user: user-0

user: user-3
content: #include <stdio.h> #include <malloc.h> int main() { 	int *A; 	int a, count, i = 0; 	printf("输入数组元素:\n"); 	A = (int *)malloc(10 * sizeof(int)); 	while (scanf("%d", &a) == 1) { 		A[i] = a; 		i++; 		count = i; 	} 	printf("数组的长度:%d\n", count); 	printf("输出数组:\n"); 	for (int j = 0; j < count; j++) { 		printf("%d", A[j]); 	} 	free(A); 	A = NULL; 	return 0; }   Linux环境gcc编译、运行截图， （输入一个数，回车一次，让while循环执行一次）：  （一次性输入完全部的数，以空格分隔，回车结束输入：）

user: user-0
content: 也不行，如果是1的话就会无限循环

user: user-3
content: 引用 6 楼 weixin_42045178 的回复:#include<stdio.h> #include<malloc.h> int main() { 	int *A; 	int a,count,i=0; 	printf("输入数组元素:\n"); 	A=(int*)malloc(sizeof(int)); 	while(scanf("%d",&a)==0) 	{ 		A[i]=a; 		i++; 		count=i; 	} 	printf("数组的长度:%d\n",count); 	printf("输出数组:\n"); 	for(int j=0;j<count;j++) 	{ 		printf("%d",A[j]); 	} 	free(A); 	return 0; }   然后我改成这样，还是输出不了数组，而且数组的长度一直是0.   额， 我上面的回复里， 给的循环条件是  while(scanf("%d",&a) == 1)啊。  。。。。。比较的数字是  1   不是 0  啊 。。。。

user: user-0
content: #include<stdio.h> #include<malloc.h> int main() { 	int *A; 	int a,count,i=0; 	printf("输入数组元素:\n"); 	A=(int*)malloc(sizeof(int)); 	while(scanf("%d",&a)==0) 	{ 		A[i]=a; 		i++; 		count=i; 	} 	printf("数组的长度:%d\n",count); 	printf("输出数组:\n"); 	for(int j=0;j<count;j++) 	{ 		printf("%d",A[j]); 	} 	free(A); 	return 0; }   然后我改成这样，还是输出不了数组，而且数组的长度一直是0.

user: user-3
content: 程序运行的图片完全看不清楚，不过代码确实有几个不是太合适的地方。  （1）因为while(getcha()!='\n')这样的循环条件，每次循环的第一个输入的值都会被getchar给吃掉，所以输入数据的时候，会不方便。比如输入「110<空格>」，那么第一个1被getchar吃掉了，变量a只接收到10这个数。就算本来就是打算输入10的，那看起来也很别扭啊！建议直接把scanf作为循环条件，比如while(scanf("%d",&a) == 1)这样。 （2）while循环里面，放了语句「A =(int *)malloc(10 * sizeof(int)); 」，那么每一次的循环都会重新malloc一次，等于说每一次的循环，都让A指向了一个新的内存块首地址（默认malloc每次都成功的情况下），那么每一次都只给A指向的内存块中的一个int型所占的内存空间赋予了值，而这个内存块中的其它允许赋值的内存空间并没有被初始化过，那么它们的值用%d输出的话就很可能是乱码，至少也是不确定的值。 （3）接第（2）点，所以应该把为A申请内存块的语句放到while的前面去。而且，既然名义上申请的内存块的大小是「10*sizeof(int)」，那么按道理为while循环也最多只执行10次才合理啊。（这里也不展开讨论malloc实际申请了多少字节了。） （4）那么，上面的while循环结束之后，A指向的是最后一次循环时用malloc申请到的内存块的首地址，其中只有一个元素A[count-1]是被正确赋值了的。而之前几次循环里malloc到的内存块，早就不知道去哪里了，至少从你的代码里是找不回来了。（这里也不讨论是否循环次数已经超过了10次的情况了。。。） （5）while循环里，为数组的程度计数的变量count的赋值也不对，比如第一次循环，那么上一句的「i++;」之后，i 的值变成了1 ， 这就是此时数组的长度了，那么 count = i + 1 ; 的话，count 的值就变成了 2 ， 那就不对了。所以 ，不嫌罗嗦的话，count = i ; 就可以。 （6）先假设 变量 count 是正确地计数了的， 那么 for 循环输出A[]的元素的值的时候，循环控制变量i从下标0开始按步进值 1 逐次增加，合法的循环终止条件应该是「i < count;」。因为如果数组下标到了count 的话，也就是说，要输出 A[count] 元素的话，那么正如前面（2～4）点所说，这个 A[count] 元素是没有被正确赋值过的，是不确定的值，也就可能输出一个乱码了。 （7）使用完malloc之后，记得free一下。  嗯，大概就这么多吧。。。

user: user-0
content: 引用 2 楼 niiiloc的回复:while循环一直在修改A的内存地址，导致出现乱码 解决方法就是把malloc放到while循环前面，记得结贴 放在前面也不行，我是想每循环一次就分配一个空间，这样就有足够的空间来存放了。

user: user-0
content: 引用 1 楼 qq_1096235292的回复:直接在声明数组的时候分配好内存不就行了，放到while循环里面分配是什么操作 因为我想输入一个不先确定长度的数组。

user: user-4
content: while循环一直在修改A的内存地址，导致出现乱码 解决方法就是把malloc放到while循环前面，记得结贴

user: user-5
content: 直接在声明数组的时候分配好内存不就行了，放到while循环里面分配是什么操作