user-0 提问: 求奇数的乘积

回复:
user: user-1
content: C99动态数组，不是先定义一个不明确的大小 而是要定义一个明确的大小 定义以后，数组的大小，就是固定的了 我举的这个例子里，n 就是每次输入的n 值，如果不是再循环里面 数组的大小是不会随着变化的 例如 C99动态数组中 scanf("%d",n); int a[n]; //这里数组的元素个数，就是刚才输入的n 的值 ....... scanf("%d",n);//这个新n值，跟数组的元素个数无关，数组保持上次的大小   while(scanf("%d",&n))     { ///这里进入新的语句组作用域           int a[n]; ///C99中，这个数组是每次循环，会重新初始化的，数组元素个数，跟新输入的n 保持一致、           /// demo(n);//为了清晰起见，代码都移到函数中了，直接写在这里也可以          n=10;///这里修改了n ，但是数组的元素个数，保持不变     } 你的代码中，n没有初始化，因此这个数组的元素个数，是不能确定的，也许很大，也许很小 很大的话。就会占用很大内存空间，很小的话，可能数组空间，就不够用了

user: user-0
content: 这样子也可以哦

user: user-0
content: 引用 9 楼 lm_whales 的回复:还有 n 必须先有一个值， 也就是你这里  scanf  要在数组定义前面。  #include<stdio.h> int main() {      int s,i,n; 	int a[n];     while(scanf("%d",&n))     {         for(s=1,i=0;i<n;i++)         {             scanf("%d",&a[i]);             if(a[i] % 2 != 0)             s = s * a[i];         }         printf("%d\n",s);     }     return 0; }

user: user-1
content: 还有 n 必须先有一个值， 也就是你这里  scanf  要在数组定义前面。

user: user-0
content: 引用 6 楼 qq423399099 的回复:你这代码改成这样是要输出啥？ 我是用你教的动态申请空间的方法放在另外一道题目上

user: user-0
content: 引用 4 楼 lm_whales 的回复:如果用了C99 ;n 同样必须初始化 另外，输入的时候，每次只是输入a[0] 其他数据并没有输入，却在应用 #include<stdio.h>  void demo(int n){         int n,s,i;         int a[n];//C99 用 变量定义数组（变量作为数组的大小）         for(s=1,i=0;i<n;i++)         {             /// scanf("%d",a); //只是输入a[0] 而已，当 i!=0 时候，并没有输入a[i]              scanf("%d",a+i); //改成 a+i 或者 &a[i] 表示要输入a[i];                                        //scanf 的实参，需要对象（数据）的地址，而非一个（整型，浮点型，字符型）值。             if(a[i] % 2 != 0)                    s = s * a[i];      //这里一直在使用a[i] ，不改的话，除了a[0] 都没有初始化。         }         printf("%d\n",s); }  int main() {     int n;       while(scanf("%d",&n))     {             demo(n);//为了清晰起见，代码都移到函数中了，直接写在这里也可以     } return 0; }  所以是说可以用c99直接用变量定义数组，只需要把scanf("%d",a); 改成 scanf("%d",&a[i]);就可以了吗？ 但是我改完之后总是会出现错误：id return 1 exit status

user: user-2
content: 你这代码改成这样是要输出啥？

user: user-0
content: #include<stdio.h> #include<stdlib.h>  int main() { 	int a,b,c,n,i; 	n<100; 	while(scanf("%d",&n)) 	{ 		int *p; 		p = (int *)malloc(sizeof(int) * n); 		for(i=0;i<n;i++) 		{ 			a = b = c = 0; 			scanf("%d",&p[i]); 			if(p[i] < 0) 				a ++; 			else if(p[i] == 0) 				b ++; 			else 				c ++; 		} 		printf("%d %d %d\n",a,b,c); 	} }  用这个代码统计给定的n个数（n<100）中，负数、零和正数的个数。 比如说输入：6 0 1 2 3 -1 0             输出：1 2 3  但是这个代码不能输出正确结果

user: user-1
content: 如果用了C99 ;n 同样必须初始化 另外，输入的时候，每次只是输入a[0] 其他数据并没有输入，却在应用 #include<stdio.h>  void demo(int n){         int n,s,i;         int a[n];//C99 用 变量定义数组（变量作为数组的大小）         for(s=1,i=0;i<n;i++)         {             /// scanf("%d",a); //只是输入a[0] 而已，当 i!=0 时候，并没有输入a[i]              scanf("%d",a+i); //改成 a+i 或者 &a[i] 表示要输入a[i];                                        //scanf 的实参，需要对象（数据）的地址，而非一个（整型，浮点型，字符型）值。             if(a[i] % 2 != 0)                    s = s * a[i];      //这里一直在使用a[i] ，不改的话，除了a[0] 都没有初始化。         }         printf("%d\n",s); }  int main() {     int n;       while(scanf("%d",&n))     {             demo(n);//为了清晰起见，代码都移到函数中了，直接写在这里也可以     } return 0; }

user: user-2
content: 引用 2楼我是你的主体 的回复:int *a = (int *)malloc(sizeof(int) * n);  这行代码的意思是：让指针a指向了一块能存放n个int的内存地址，可以理解为动态创建了数组a[n]?

user: user-0
content: 嗯嗯 明白了 谢谢

user: user-0
content: int *a = (int *)malloc(sizeof(int) * n);  这行代码的意思是：让指针a指向了一块能存放n个int的内存地址，可以理解为动态创建了数组a[n]?

user: user-2
content: 两处错误： 1.int a[n];你的n都没有附上值，怎么能这样申请数组的空间？ 改成用malloc动态申请 2.scanf("%d",a);要改成scanf("%d",&a[i]);  #include<stdio.h> #include<stdlib.h> int main() { 	int n,s,i; 	 	while(scanf("%d",&n)) 	{ 		int *a = (int *)malloc(sizeof(int) * n); 		for(s=1,i=0;i<n;i++) 		{ 			scanf("%d",&a[i]); 			if(a[i] % 2 != 0) 			s = s * a[i]; 		} 		printf("%d\n",s); 		free(a); 	} }