内存错误,指针数组

时间:2018-02-03 16:41:41

标签: c arrays linux pointers

我正在编写一个简单的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);
        }

    }

}

2 个答案:

答案 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是双指针的类型,您应该为arrayarray[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)来释放动态分配的内存。

我希望它有所帮助。