我無法理解爲什麼這段代碼無法正常工作。指針和結構問題
#include <stdio.h>
#include <stdlib.h>
#include "runSolver.h"
typedef struct testStruct {
double *x[11];
double *u[10];
} Test;
typedef struct returnStruct_t {
Test* vars;
} ReturnStruct;
void initalize_returnStruct(void** returnStruct){
ReturnStruct* new_returnStruct = (ReturnStruct *)malloc(sizeof(new_ReturnStruct));
Test* varsStruct = (Test*)malloc(sizeof(Test)*3);
int dataSize = 5;
int i;
for(i = 0; i < 3; i++){
int x;
for(x = 0; x < 11; x++){
fprintf(stderr, "i:%d and x:%d for x\n", i, x);
varsStruct[i].x[x] = (double *)malloc(sizeof(double)*5);
}
for(x = 0; x < 10; x++){
fprintf(stderr, "i:%d and x:%d for u\n", i, x);
varsStruct[i].u[x] = (double *)malloc(sizeof(double)*5);
}
}
new_returnStruct->vars = varsStruct;
*returnStruct = new_returnStruct;
}
此功能是通過Python的叫:
#!/usr/bin/python
import ctypes as ct
class returnStruct_t(ct.Structure):
_fields_ = [("vars", Test_t*3)]
runSolver = ct.CDLL('./runSolverParallel.so')
varsd = ct.c_void_p()
runSolver.initalize_returnStruct(ct.byref(varsd))
我所試圖做的是以下幾點:
傳遞一個空指針到一個名爲
指針returnPointer
實例化一個類型爲的指針
實例化的指針類型的尺寸3的陣列
Test
實例化
Test
結構的數據成員x
和u
有
returnPointer
點到完全實例化ReturnStruct
當我運行代碼列出它本身當我試圖爲new_returnStruct->vars[0].u[0]
分配空間時,在第二個內部for循環的第一次迭代中使用gfaults。如果我完全消除double *u[10]
及其instatiation decleartion decleartion我得到一個段錯誤,我設置returnPointer
指向ReturnStruct
:*returnStruct = new_return;
。老實說,我不知道到底發生了什麼。任何幫助都會很棒。
PS:我使用的是double *x[11]; double *u[10];
而不是double **x; double **u;
,因爲struct Test
不是我將要使用的真實結構。真正的結構是在庫中的其他地方定義的,並且具有這兩個變量以及大約20個其他變量。我想最終用該結構替換Test
,但我希望首先使用Test
來處理此代碼。僅供參考,實際結構Test
將被替換爲:
typedef struct Vars_t {
double *u_0; /* 1 rows. */
double *u_1; /* 1 rows. */
double *u_2; /* 1 rows. */
double *u_3; /* 1 rows. */
double *u_4; /* 1 rows. */
double *u_5; /* 1 rows. */
double *u_6; /* 1 rows. */
double *u_7; /* 1 rows. */
double *u_8; /* 1 rows. */
double *u_9; /* 1 rows. */
double *x_1; /* 5 rows. */
double *x_2; /* 5 rows. */
double *x_3; /* 5 rows. */
double *x_4; /* 5 rows. */
double *x_5; /* 5 rows. */
double *x_6; /* 5 rows. */
double *x_7; /* 5 rows. */
double *x_8; /* 5 rows. */
double *x_9; /* 5 rows. */
double *t_01; /* 1 rows. */
double *t_02; /* 1 rows. */
double *t_03; /* 1 rows. */
double *t_04; /* 1 rows. */
double *t_05; /* 1 rows. */
double *t_06; /* 1 rows. */
double *t_07; /* 1 rows. */
double *t_08; /* 1 rows. */
double *t_09; /* 1 rows. */
double *t_10; /* 1 rows. */
double *x_10; /* 5 rows. */
double *u[10];
double *x[11];
} Vars;
我不知道怎麼這甚至*編譯*。 'return'是你列出的第一個函數的參數名稱,是一個保留字。發佈* real *代碼,並使用生成您正在展示的輸出的'int main()',以及文件頂部的'#include'列表以及您採取的所有步驟*調試*這。來自'gdb'的後面跟蹤可能會說明數量。 – WhozCraig 2014-08-29 19:42:48
@WhozCraig Opps不知道如何改變爲'return',它應該是'returnStruct'。另外我通過'ctypes'從python調用這個函數,所以沒有'int main()'。我會發布python代碼。 – ryan 2014-08-29 19:48:44
這段代碼段錯誤是因爲你沒有在解引用這個指針之前爲'new_returnStruct-> vars'分配內存。此外,您應該使用malloc(sizeof(* new_returnStruct))代替第一行中的當前代碼,儘管它很可能不是崩潰的原因。 – kfx 2014-08-29 19:58:19