2014-08-29 163 views
0

我無法理解爲什麼這段代碼無法正常工作。指針和結構問題

#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結構的數據成員xu

  • 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; 
+2

我不知道怎麼這甚至*編譯*。 'return'是你列出的第一個函數的參數名稱,是一個保留字。發佈* real *代碼,並使用生成您正在展示的輸出的'int main()',以及文件頂部的'#include'列表以及您採取的所有步驟*調試*這。來自'gdb'的後面跟蹤可能會說明數量。 – WhozCraig 2014-08-29 19:42:48

+0

@WhozCraig Opps不知道如何改變爲'return',它應該是'returnStruct'。另外我通過'ctypes'從python調用這個函數,所以沒有'int main()'。我會發布python代碼。 – ryan 2014-08-29 19:48:44

+0

這段代碼段錯誤是因爲你沒有在解引用這個指針之前爲'new_returnStruct-> vars'分配內存。此外,您應該使用malloc(sizeof(* new_returnStruct))代替第一行中的當前代碼,儘管它很可能不是崩潰的原因。 – kfx 2014-08-29 19:58:19

回答

1

在你的代碼是爲ReturnStruct *指針而不是實際的結構 而不是

ReturnStruct* new_returnStruct = (ReturnStruct *)malloc(sizeof(new_returnStruct)); 

分配內存試試這個

ReturnStruct* new_returnStruct = (ReturnStruct *)malloc(sizeof(ReturnStruct)); 
+1

此外,**不需要**來投射'malloc'。只需使用:'ReturnStruct * new_returnStruct = malloc(sizeof(ReturnStruct));' – 2014-08-29 20:42:12

2

有在你的代碼中的一些錯誤:

此行HOULD是ReturnStruct而不是new_returnStruct作爲參數sizeof

ReturnStruct* new_returnStruct = (ReturnStruct *)malloc(sizeof(new_returnStruct)); 

您確定sizeof(Test) == sizeof(Pee)*3或者實際上您爲什麼使用Pee而不是Test

Test* varsStruct = (Test*)malloc(sizeof(Pee)*3); 
+1

我沒有看到'varsStruct [i] .x [0]'的問題(如果'varsStruct'是'Test **',它將會失效)。 'sizeof varsStruct-> x'很好,'sizeof(double)* 11'肯定是錯的('sizeof(double *)* 11'也是正確的)。 – mafso 2014-08-29 20:09:27

+0

我將此發佈重命名爲'Pee'爲'Test'。只是忘了在那一個地方改變它。感謝您的幫助! – ryan 2014-08-29 20:11:20

+0

閱讀'varsStruct'的def:它是'Test *'。有了'i = 1',它會發生段錯誤或做任何事情,但它應該(但是,即使我現在不做C,我很確定我沒有錯那個)。 – NoDataFound 2014-08-29 20:13:34