我正在嘗試完成C中稀疏矩陣的賦值。我有一個稀疏矩陣作爲值和座標列表保存,並將其轉換爲耶魯格式。結構calloc中的動態數組或指針失敗,C
我遇到了一個似乎沒有人見過的奇怪的內存分配問題。我的代碼是:
yale* convertMatrix(matrix_list* input){
int matrix_elements = input->elements;
int matrix_rows = input->m;
yale* yale = (struct y*)calloc(1, sizeof(yale));
int* A = (int*)calloc(matrix_elements, sizeof(int));
int* IA = (int*)calloc(matrix_rows + 1, sizeof(int));
int* JA = (int*)calloc(matrix_elements, sizeof(int));
printf("%d elements\n",matrix_elements);
yale->A = A; // Value
yale->IA = IA; // Row (X)
yale->JA = JA; // Column (Y)
yale->elements = matrix_elements;
yale->m = matrix_rows;
yale->n = input->n;
list* tmp_list = input->first;
for(int i = 0, j = 0, tmp_y = 0; i < matrix_elements && tmp_list!=NULL; i++){
printf("Input Value: %d \n",tmp_list->point.value);
A[i] = tmp_list->point.value;
// Initialise the first row
if(i == 0) IA[0] = tmp_list->point.x;
else{
// Add a new row index
if(tmp_y != tmp_list->point.x){
j++;
IA[j] = i;
tmp_y = tmp_list->point.x;
}
}
JA[i] = tmp_list->point.y;
tmp_list = tmp_list->next;
}
for(int i = 0; i < matrix_elements; i++)
printf("%d,",yale->A[i]);
printf("\n");
for(int i = 0; i < matrix_rows + 1; i++)
printf("%d,",yale->IA[i]);
printf("\n");
for(int i = 0; i < matrix_elements; i++)
printf("%d,",yale->JA[i]);
return yale;
}
這裏是耶魯大學的結構:
typedef struct y{
int n;
int m;
int elements;
int *IA;
int *JA;
int *A;
} yale;
但在環路上的第一次迭代的第一個相關的printf的程序段錯誤。
printf("%d,",yale->A[i]);
我敢肯定: matrix_elements是(在我的測試案例9)的整數 matrix_rows是一個整數 A/IA/JA都充滿了正確的值(如果換成yale->一種在printf中,它工作正常)。 將數組直接調用到結構指針不會影響結果。編程,調用,不是類型轉換,都不起作用。
感謝Xcode和gdb我也可以看到,在段錯誤點。該結構的指針就不似乎指向數組
對於一個類型和一個變量都有相同的名字不是一個好主意,因爲它可能會導致其他人(或者幾個星期後)的混淆。 –
在第一個循環結束時打印出'i'和'j'的值,以確保你沒有超過分配給'A' /'IA' /'JA'的內存末尾。 – NPE
如果您發佈了可編譯的片段,這將有所幫助。另外:包括並移除鑄件。就我個人而言,我也會刪除typedef,並用unsigned int替換所有的int,但這是一個有趣的問題。 –
wildplasser