Скопировать указатель на указатель на структуру внутри структуры в C - PullRequest
0 голосов
/ 31 августа 2011

Имеют два потока, которым необходим доступ к одной и той же глобальной C-структуре. Мне нужно скопировать значения из функции в следующую структуру

typedef struct {
    struct queue ** queue1;
} my_struct;

my_struct my_queue;

my_func(struct queue ** queue2)
{
    my_queue.queue1 = queue2;
    *(my_queue.queue1) = malloc(sizeof( struct * queue));
    *(my_queue.queue1) = *queue2;
}

Когда я проверяю значения, my_queue.queue1 правильно указывает на тот же адрес, что и queue2, но * (my_queue.queue1) не указывает на тот же адрес, что и * queue2. Как мне сделать их такими же? Мне нужно знать два подхода. Во-первых, как мне заставить их указывать на одни и те же структуры с помощью указателя и что, если я хочу сделать копию структур?

Ответы [ 2 ]

0 голосов
/ 06 сентября 2011

Зачем вам нужно malloc для структуры: (структура очереди *) malloc (sizeof (структура очереди *))

Если мне нужно сохранить указатель на указатель, мне не нужно malloc. Обе переменные могут указывать на один и тот же адрес.

Например:

int i = 1;
int *j = &i;
int **k = &j;

Маллок не нужен для к ..

0 голосов
/ 03 сентября 2011

Я думаю, что ваша программа не будет правильно скомпилирована. sizeof (структура * очередь) выглядит неправильно.

Возможно, вы имеете в виду что-то вроде этого:

#include <stdio.h>
#include <stdlib.h>

struct queue { int foo;};

typedef struct {
  struct queue **queue1;
} my_struct;

my_struct my_queue;

my_func(struct queue *queue2)
{
  my_queue.queue1 = (struct queue **)malloc(sizeof(struct queue **));
  *(my_queue.queue1) = queue2;
}

int main(int argc, char **argv){
  struct queue *queue2  = (struct queue *)malloc(sizeof(struct queue *));
  queue2->foo = 3;

  printf("queue2 value is %d\n", queue2->foo);

  my_func(queue2);
  printf("queue ptrs are %ld and %ld\n",
     (long)*(my_queue.queue1), (long)queue2);
  printf("queue values are %d and %d\n",
     (*(my_queue.queue1))->foo,
     queue2->foo);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...