带有void *

时间:2018-10-18 21:08:21

标签: c struct pthreads void

嗨,

我想知道是否有可能在不使用heap(malloc / calloc)的情况下实现这种假设? 像这样:

typedef struct {
  void* par1_;
  void* par2_;
}parameters;

和另一个位置:

typedef struct {
  short x;
  short y;
}position;

这是一个被线程调用的函数。

void* car(void* arg)
{
   parameters car_type = *((parameters*) arg);
   int first_par = *(int*)&car_type.par1_;
   int second_par = *(int*)&car_type.par2_;   // can I do this?
   //if yes how do I extract now values from position struct "pos.x and pos.y" 
}

在主线程中,我要标记“位置”结构中的位置,将该结构分配给第二个参数“ par2_”,然后将其发送到我的功能车中。

int main()
{
  parameters pars;
  position pos;

  pos.x = 44;
  pos.y = 25;

  pars.par1_ = (void*) CAR_TYPE; // Global Variable
  pars.par2_ = &pos;   // not sure about this?

  pthread_t tid;
  pthread_create(&tid, NULL, car, (void*) &pars);

  pthread_join(tid, NULL);

很抱歉,如果这是一个愚蠢的问题。显然,我是新手。再一次,我不想使用堆。这是我程序的最小示例。

2 个答案:

答案 0 :(得分:0)

我认为您想要更多类似的东西;

Open C4;
LOOP
    FETCH c4 into o_var;
    EXIT WHEN c4%NOTFOUND;
    dbms_output.put_line('v_calc_id: ' || v_calc_id || ', hr: ' || o_var.hr);
    insert into calc (calc_id, calc_Date, calc_name, report_dt, create_dt)
    values(null, sysdate, 'TEST', o_var.hr, sysdate);
END LOOP
Close C4;

尽管您可能只想更改参数结构以包含您真正想要的类型。

void* car(void* arg)
{
   parameters car_type = *((parameters*) arg);
   int first_par = car_type.par1_; // This is CAR_TYPE is it really an int?
   position *second_par = (position *)car_type.par2_; 

   second_par->x, second_par->y;
}

答案 1 :(得分:0)

不确定您要问的是什么,因此,我将为您提供与情况有关的标准建议。

终身

在将指针传递到堆栈存储器时,请非常小心。始终牢记以下三点:

  1. 将使用什么指针?
    它有什么用?哪些功能将最终实现?您需要知道这一点才能处理接下来的两点。
  2. 指针将存储在哪里?
    如果指针从不离开堆栈,那就没问题了。如果指针存储在堆内存中(这有可能使堆栈帧失效),则会发出警报。 如果指针超出了堆栈框架的长度,则可怕的意外数据损坏是该过程的标准。不允许这种情况发生。
  3. 何时使用指针?
    第一次使用该内存的堆栈帧中的任何内容或调用它都可以。除此之外,存储器不是您的玩物。确保您永远不会 EVER EVER 返回一个指向刚刚获得的堆栈内存的指针。

要重申:

要做:

#include <stdio.h>

int main(int argc, char *argv[]) {
    int nums = {12, 630, 43, 0};
    printf("%d", sum(nums));
}

int sum(int *num_pointer) {
    int count = 0;
    for (; *num_pointer; num_pointer += 1) {
        add(&count, *num_pointer);
    }
    return count;
}

void add(int *a, int b) {
    *a += b;
}

不要:

int main(int argc, char *argv[]) {
    print_int(get_int(7));
}

int *get_int(int value) {
    return &value;
}

void print_int(int *num) {
    printf("%d", *num);
}

此外,在不需要时也不要键入。这是一个糟糕的程序设计的重要信号。考虑修改它。