user-0 提问: C语言中malloc的问题

回复:
user: user-0
content: 引用 10 楼 github_27756899 的回复:free(counter); 完后加 counter=NULL; 就不容易错了。  谢谢大神指导

user: user-1
content: free(counter); 完后加 counter=NULL; 就不容易错了。

user: user-1
content: 简单点说就是counter分配了内存(未free)。

user: user-1
content: 引用 楼主 robin_Xu_shuai 的回复:int i; 	int j; 	char filename[200]; 	FILE* fread; 				 	Item* item_1;		/* 				   Item有两个域，第一个域dimension_1是用来存放数据 				   		 第二个域clusterID,现在被用来存放相同的数据出现的个数 				*/	 	//test 	for( i = 1; i <= cluster_count; i++ ) 		printf("the size of cluster %d is %d\n", i, counter[i]); 	//test END  	for( i = 1; i <= 1; i++ ) 	{ 		printf("@@@@@@@@%d\n", counter[i]); 		sprintf(filename, ".//ClusterProcess_1dimension//round%d_cluster%d.data", count, i); 		if( NULL == (fread = fopen(filename, "r"))) 		{ 			printf("open file(%s) error!\n"); 			exit(0); 		} 		item_1 = (Item*)malloc(sizeof(struct Item) * (counter[i] + 1)); 		/* 		if( !item_1 ) 		{ 			printf("item malloc error %d\n", i); 			exit(0); 		} 		*/ 		printf("@@@@@@@@%d\n", counter[i]); 		/* 		for( j = 1; j <= counter[i]; j++ ) 		{ 			if( 1 != fscanf(fread, "%d ", &item_1[j].dimension_1)) 			{ 				printf("scanf error: %s : %d", filename, j); 				exit(0); 			} 			printf("cluster_center : %d --- %d \n", i, j); 		} 		*/ 		free(item_1); 		//fclose(fread); 	} 为什么第32行和第17行的输出结果不一致，出现了乱码，如果去掉24行则正常。 其中调用	//test 	for( i = 1; i <= cluster_count; i++ ) 		printf("the size of cluster %d is %d\n", i, counter[i]); 	//test END 之前应该 counter = (int *) malloc(size);  即 //test counter = (int *) malloc(sizeof(int)*(cluster_count+1));  	for( i = 1; i <= cluster_count; i++ ) 		printf("the size of cluster %d is %d\n", i, counter[i]); 	//test END

user: user-0
content: 引用 6 楼 github_27756899 的回复:之前调用函数中的 free(counter); 这句删除。  您能解释一下吗，之前那个函数是循环调用了多次的，所以我用了free，并且之前也是没有错的（没有我问题中说的那个函数之前） 谢谢

user: user-1
content: 之前调用函数中的 free(counter); 这句删除。

user: user-0
content: 引用 4 楼 robin_Xu_shuai 的回复:[quote=引用 3 楼 github_27756899 的回复:] counter = (int *) malloc(size);  free(counter); //其它函数有没有调用?  有调用，但是是在之前，这个函数是最后的函数。请您指教这样有什么问题吗[/quote] /*  * 重新计算新的cluster center  * */ void calculate_clusterCenter(int round){					 	int i; 	double* new_X_Y;	/* 				   用来计算和保存新的cluster center的值，同样的，0号元素不用。1,2号元素分别用来 				   存放第一个聚类的所有的项的x和y的累加和。3,4号元素分别用来存放第二个聚类的所有 				   的项的x和y的累加和...... 				*/ 	new_X_Y = (double*)malloc(sizeof(double) * (cluster_count + 1)); 	if( !new_X_Y ) 	{ 		printf("malloc error: new_X_Y!\n"); 		exit(0); 	} 	//初始化为0 	for( i = 1; i <= cluster_count; i++ ) 		new_X_Y[i] = 0.0;  	counter = (int*)malloc(sizeof(int) * (cluster_count + 1)); 	if( !counter ) 	{ 		printf("malloc error: counter\n"); 		exit(0); 	} 	//初始化为0 	for( i = 1; i <= cluster_count; i++ ) 		counter[i] = 0;  	for( i = 1; i <= data_size; i++ ) 	{ 		new_X_Y[data[i].clusterID] += data[i].dimension_1;	//统计每个聚类中的项的和 		counter[data[i].clusterID]++;				//统计每个聚类中的项的个数 	}  	//test 	for( i = 1; i <= cluster_count; i++ ) 		printf("%f\t", new_X_Y[i]); 	printf("\n"); 	for( i = 1; i <= cluster_count; i++ ) 		printf("%d\t", counter[i]); 	printf("\n"); 	//testEND  	for( i = 1; i <= cluster_count; i++ ) 	{ 		new_X_Y[i] = new_X_Y[i] / (double)(counter[i]); 	}  	//test 	/* 	printf("new cluster center:\n"); 	for( i = 1; i <= 2 * cluster_count; i++ ) 		printf("%f\t", new_X_Y[i]); 	printf("\n"); 	*/ 	//testEND 	 	//要将cluster center的值保存在文件中，后续作图 	writeClusterCenterToFile(round); 	 	/* 	 * 在这里比较一下新的和旧的cluster center值的差别。如果是相等的，则停止K-means算法。 	 * */ 	compareNew_OldClusterCenter(new_X_Y);  	//将新的cluster center的值放入cluster_center_new 	for( i = 1; i <= cluster_count; i++ ) 	{ 		cluster_center_new[i].dimension_1 = new_X_Y[i]; 		cluster_center_new[i].clusterID = i; 	} 	free(new_X_Y); 	free(counter);  	//在重新计算了新的cluster center之后，意味着我们要重新来为每一个Item进行聚类，所以data中用于表示聚类ID的clusterID 	//要都重新置为0。 	for( i = 1; i <= data_size; i++ ) 	{ 		data[i].clusterID = 0; 	} }

user: user-0
content: 引用 3 楼 github_27756899 的回复:counter = (int *) malloc(size);  free(counter); //其它函数有没有调用?  有调用，但是是在之前，这个函数是最后的函数。请您指教这样有什么问题吗

user: user-1
content: counter = (int *) malloc(size);  free(counter); //其它函数有没有调用?

user: user-0
content: 引用 1 楼 github_27756899 的回复:counter[i] 的声明?  是动态的数组，在另外一个函数中使用malloc分配的，不可以吗

user: user-1
content: counter[i] 的声明?