【问题标题】:C++ got wrong value from array of structC++ 从结构数组中得到错误的值
【发布时间】:2017-01-16 09:32:57
【问题描述】:

问题如上所述。当我尝试从加载的 *.so 文件(使用 libdl)中读取值时,在结构中我得到了错误的值 申请代码:

#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。我的代码有什么问题?

提前致谢

【问题讨论】:

    标签: c++ c arrays struct


    【解决方案1】:

    访问

    pointer[0].z[1]
    

    具有未定义的行为,因为它具有不确定的值。


    object_info 从不修改ptr 指向的数组。它只是简单地修改一个本地数组,并分配本地ptr 指向该本地数组。

    解决方案:不要声明本地数组,而是修改参数指向的数组。换句话说,将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]; 将声明一个可变长度数组。 C++ 中不允许使用 VLA。

    要么使用 C(自 C99 起支持 VLA,但自 C11 起仅可选支持),或使用动态数组:std::vector&lt;face&gt; 或接受您的程序不符合标准的事实。

    【讨论】:

      【解决方案2】:

      函数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;
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-12
        • 2018-06-24
        • 2015-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-24
        • 1970-01-01
        相关资源
        最近更新 更多