[英]Code crashes on c, most likely something to do with malloc?
這是非常基本的,但我一直試圖解決它幾個小時,但沒有成功。 該代碼應該從用戶輸入讀取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;
}
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
雙打。
代碼在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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.