2017-01-16 92 views
0

問題如上所述。當我嘗試讀取加載的* .so文件(使用libdl)值,whih在結構我得到錯誤的價值觀 代碼應用:C++從結構數組中得到了錯誤的值

#include <dlfcn.h> 
#include <iostream> 

/* For face data type reproduction */ 
#define GET_FACE_XYZ_SIZE 1 
/* For face_array reproduction */ 
#define GET_FACE_ARRAY_SIZE 2 
#define GET_OBJECT_DATA 3 

typedef struct face { 
    float x[1000]; 
    float y[1000]; 
    float z[1000]; 
    int vertices; 
} face; 


int main() 
{ 
    void *hook; 
    int (*fn)(int request_type, void *ptr); 
    hook = dlopen("/root/osms/dlopen-test/lib.so", RTLD_LAZY); 
    if(!hook) 
    { 
     std::cout << "Couldn't find lib.so" << std::endl; 
    } 
    fn = dlsym(hook, "object_info"); 
    int face_array_size = fn(GET_FACE_ARRAY_SIZE, NULL); 
    std::cout << "FACE_ARRAY_SIZE: " << face_array_size << std::endl; 
    face pointer[face_array_size]; 
    fn(NULL, pointer); 
    dlclose(hook); 
    std::cout << "pointer[0].z[1]: " << pointer[0].z[1] << std::endl; 
return 0; 
} 

和lib.so代碼:

/* For face data type reproduction */ 
#define GET_FACE_XYZ_SIZE 1 
/* For face array reproduction */ 
#define GET_FACE_ARRAY_SIZE 2 
#define GET_OBJECT_DATA 3 

typedef struct face { 
    float x[1000]; 
    float y[1000]; 
    float z[1000]; 
    int vertices; 
} face; 

extern "C" int object_info(int request, void *ptr) 
{ 
    face face_array[2]; 
    face_array[0].x[0] = 1.1; 
    face_array[0].y[0] = 0.5; 
    face_array[0].z[0] = 1.2; 
    face_array[0].x[1] = 1.6; 
    face_array[0].y[1] = -0.11; 
    face_array[0].z[1] = -12; 
    face_array[0].x[2] = -0.12; 
    face_array[0].y[2] = 0.24; 
    face_array[0].z[2] = -0.12; 
    face_array[0].vertices = 3; 

    face_array[1].x[0] = -1.1; 
    face_array[1].y[0] = 0.15; 
    face_array[1].z[0] = -1.2; 
    face_array[1].x[1] = -1.6; 
    face_array[1].y[1] = 0.11; 
    face_array[1].z[1] = 1.2; 
    face_array[1].x[2] = 0.12; 
    face_array[1].y[2] = -0.24; 
    face_array[1].z[2] = 0.12; 
    face_array[1].vertices = 3; 

    if(request == GET_FACE_ARRAY_SIZE) 
    { 
     return 2; 
    } 
    else 
    { 
     ptr = face_array; 
    } 
} 

期望的輸出是pointer[0].z[1]: -12但我得到pointer[0].z[1]: -0.12。我的代碼有什麼問題?

在此先感謝

回答

1

訪問

pointer[0].z[1] 

是未定義行爲,因爲它有一個不確定的值。


object_info從未修改由ptr指向的數組。它只是修改本地數組,並指定本地ptr指向該本地數組。

解決方案:不要聲明本地數組,而是修改參數指向的數組。換句話說,repace face face_array[2];有:

face* face_array = (face*)ptr; 

,擺脫,什麼也不做有意義的ptr = face_array;的。


object_info聲明爲返回int,但並非所有的代碼路徑返回一個值。當函數在沒有返回語句的情況下到達object_info的末尾時,行爲是未定義的。

解決方案:如果函數不是void,則始終返回一個值。


face_array_size不是編譯時間常數的值,所以將face pointer[face_array_size];聲明一個可變長度數組。 VLA在C++中是不允許的。

既可以使用C(自C99以來支持VLA,但僅支持自C11以來的版本),也可以使用動態數組:std::vector<face>或者因爲您的程序不符合標準而使用它們。

0

函數object_info中的變量「face_array」和main中的變量「pointer」不是同一個變量。 語句「ptr = face_array」不會更改「指針」的內容。

extern "C" int object_info(int request, face *face_array) 
{ 
if(request == GET_FACE_ARRAY_SIZE) 
    return 2; 
face_array[0].x[0] = 1.1; 
face_array[0].y[0] = 0.5; 
face_array[0].z[0] = 1.2; 
face_array[0].x[1] = 1.6; 
face_array[0].y[1] = -0.11; 
face_array[0].z[1] = -12; 
face_array[0].x[2] = -0.12; 
face_array[0].y[2] = 0.24; 
face_array[0].z[2] = -0.12; 
face_array[0].vertices = 3; 

face_array[1].x[0] = -1.1; 
face_array[1].y[0] = 0.15; 
face_array[1].z[0] = -1.2; 
face_array[1].x[1] = -1.6; 
face_array[1].y[1] = 0.11; 
face_array[1].z[1] = 1.2; 
face_array[1].x[2] = 0.12; 
face_array[1].y[2] = -0.24; 
face_array[1].z[2] = 0.12; 
face_array[1].vertices = 3; 

}