这是非常基本的,但我一直试图解决它几个小时,但没有成功。该代码应该从用户输入读取3个int,然后根据int(n =多少,d =维度,k与此部分无关)指向并创建它们的数组。由于某种原因,它在第二个循环中崩溃,它无法创建第二个点,但我不知道为什么。我认为它可能与malloc有关,但我完全迷失了,不胜感激任何帮助。
我插入了输入:
5 3 2
1.2 3.4 0.1
坠毁前2次。
代码如下:
int main(){
double* pdata;
int n,d,k;
scanf("%d %d %d",&n,&d,&k );
SPPoint* parr [n];
for(int i=0; i<n; i++)
{
double darr [d];
for(int j = 0; j < d-1; j++)
{
scanf(" %lf", &darr[j]);
}
scanf(" %lf", &darr[d-1]);
pdata = darr;
parr[i] = spPointCreate(pdata, d, i);
}
}
这是spPointCreate函数的代码:
struct sp_point_t{
double* data;
int dim;
int index;
};
SPPoint* spPointCreate(double* data, int dim, int index){
SPPoint* point = malloc(sizeof(SPPoint*));
if(point == NULL)
{
return NULL;
}
point->data = (double*) malloc(sizeof(data));
for( int i=0 ; i<dim ; i++)
{
point->data[i] = data[i];
}
point->dim = dim;
point->index = index;
return point;
}
答案 0 :(得分:3)
SPPoint* point = malloc(sizeof(SPPoint*));
应该是:struct SPPoint* point = malloc(sizeof(*point));
point->data = (double*) malloc(sizeof(data));
应为point->data = malloc(dim * sizeof(*point->data));
因为你想为你的观点分配dim
双打。
答案 1 :(得分:1)
代码在2个地方错误分配
// Bad
SPPoint* spPointCreate(double* data, int dim, int index){
SPPoint* point = malloc(sizeof(SPPoint*)); // allocate the size of a pointer
...
point->data = (double*) malloc(sizeof(data)); // allocate the size of a pointer
相反,避免错误编码类型并分配到去引用变量的大小。
还需要分配N
个对象。
SPPoint* spPointCreate(double* data, int dim, int index){
size_t N = 1;
SPPoint* point = malloc(sizeof *point * N);// allocate the size of `*point` * N
...
assert(dim >= 0);
N = dim;
point->data = malloc(sizeof *(point->data) * N);
BTW,不需要投射malloc()
的结果。
第二次分配将受益于NULL
检查。更复杂的是,dim
可能为0,malloc()
返回NULL
就好了。
N = dim;
point->data = malloc(sizeof *(point->data) * N);
if (point->data == NULL && N > 0) {
free(point);
return NULL;
}