我正在编写一个简单的C程序来获取用户输入来创建任意数量的float数组,每个数组将包含任意数量的浮点数。我必须使用动态分配的存储,而且我在创建正确的数据结构时遇到了麻烦。我一直在阅读有关2D数组的内容,并且我使用指针重新创建相同的功能。
示例运行:
Enter number of Datasets:
2
2
Enter size of dataset 0:
5
Size = 5
Array #: 0
Enter each float value:5
count: 0
size: 5
Enter each float value:4
count: 1
size: 5
Enter each float value:3
Segmentation fault (core dumped)
我不确定我的数组语法是否正确,我不知道如何使用指针获取第i个数组的第n个元素。与2D数组一样,我可以简单地放入数组[i] [n]。
我对外部数组进行了malloc()调用,然后每行调用一次。但是如何使用array [i] [n]语法访问和写入行的每个元素? 我使用每行的第一个元素来保存该行的大小。
以下是我的代码:
#include <stdio.h>
#include <stdlib.h>
int numData;
int numVal;
float **array;
int main(){
/*get number of datasets */
numData = NumOfSet();
printf("%d\n",numData);
array = malloc(numData * sizeof(float));
if(array != 0){
/* get # of values per dataset and enter those values */
NumOfVal(numData);
}
else{
printf("Memory Allocation Failed");
}
}
int NumOfSet(){
printf("Enter number of Datasets: \n");
scanf("%d",&numData);
return(numData);
}
/* for each data set declare size and input float values */
int NumOfVal(int data){
int index; /* counters */
int array_index;
int copy;
float size;
float val;
for(index = 0; index < data;index++){
printf("Enter size of dataset %d:\n", index);
scanf("%f", &size);
copy = size;
printf("Size = %d\n", copy);
printf("Array #: %d\n", index);
/* malloc() call here?? */
*(array + index) = &size;
/* loop for entering float values */
for(array_index = 0; array_index < copy; array_index++){
printf("Enter each float value:");
scanf("%f", &val);
*(array[index] + array_index ) = val;
printf("count: %d\n",array_index);
printf("size: %d\n",(int) size);
}
}
}
答案 0 :(得分:0)
array
是指向float指针的指针。因此,您需要为第一个维度相应地分配它:
array = malloc(numData * sizeof(*float));
在随后的中,您需要为每一行分配内存:
array[index] = malloc(size * sizeof(float)); // or: *(array + index) = ...
不要忘记清理记忆!您需要先释放所有元素aray[i]
,然后再释放第一个维度array
。
答案 1 :(得分:0)
给定代码中的错误很少,首先是
float **array;
array
是双指针的类型,您应该为array
和array[index]
动态分配内存
array = malloc(numData * sizeof(float*));
/** allocating memory for each row **/
for(int i = 0 ;i < numData ;i++) {
array[i] = malloc(sizeof(float));
}
其次,以下声明
*(array + index) = &size;
应该是
array[0][index] =size; // or something else like array[row][col] = size;
最后,分别通过调用free(array[index])
和free(array)
来释放动态分配的内存。
我希望它有所帮助。