2013-04-15 1 views
4
#include <stdio.h> 
void pass(void*); 
int main() 
{ 
    int x; 
    x = 10; 
    pass((void*)x); 
    return 0; 
} 
void pass(void* x) 
{ 
    int y = (int)x; 
    printf("%d\n", y); 
} 


output: 10 

моих вопросов из приведенной выше коды ..типа литье целого опорожнить *

  1. , что происходит, когда мы типаж нормальных переменных опорожнить * или любой переменный указатель?

  2. Мы должны передать адрес переменной функции, поскольку в аргументе определения функции указана переменная указателя. Но этот код передает нормальную переменную.

Этот формат следует за программированием linux pthread ... Я программист уровня C. Я компилирую эту программу в компиляторе linux gcc.

+4

«Что произойдет, если typcating normal variable to void * или любая переменная указателя?» Зависит от реализации. Обратите внимание, что не гарантируется, что листинг 'int' to' void * 'и back дает исходное значение (хотя обычно это делает). –

+0

Что вы на самом деле пытаетесь достичь? –

+0

Обычно такой тип литья не вызывает никакой озабоченности, если адреса кодируются с использованием той же длины, что и «тип переменной» ('int' в вашем случае). Но @DanielFischer прав, риск состоит в том, что вы потеряете некоторую информацию, если емкость вашей переменной меньше, чем длина адреса. Таким образом, что-то вроде 'void * ptr1 = a_pointer(); char ptr_c = (char) ptr1; void * ptr2 = (void *) ptr_c; 'приведет к утверждению' ptr1! = ptr2' – Rerito

ответ

4

Я только угадываю здесь, но я думаю, что то, что вы должны сделать, это передать адрес переменной в функцию. Вы можете использовать адрес-оператора &, чтобы сделать это

int x = 10; 
void *pointer = &x; 

И в функции вы получите значение указателя с помощью оператора разыменования *:

int y = *((int *) pointer); 
+1

«Я думаю, что вы должны сделать, это фактически передать адрес переменной функции« Не обязательно. Если это данные для процедуры потока, то вы обычно хотите передать значение. –

+0

@DavidHeffernan Я немного перефразировал это предложение. –

+1

Если вы собираетесь передать адрес, вам, как правило, потребуется дополнительное управление временем жизни объекта. Обычно это означает, что указатель выделяется с помощью 'malloc', а затем уничтожается путем вызова' free' в потоке proc. Автоматическое хранилище не то, что вам нужно для потока proc. Я знаю, что код в Q не для потока proc, но он явно упоминается как мотивация. –

0

Пожалуйста, прочтите why glib предоставляют макросы для этого вроде конверсий, здесь нет необходимости повторять текст. Главное: указатель имеет размер, зависящий от платформы.

+0

Напротив, здесь нужно повторить текст. Эта связь рано или поздно гниет, превращая ваш ответ в совершенно бесполезный. См. [Здесь] (http://meta.stackexchange.com/q/118582/169090) для получения дополнительной информации. – Shahbaz

0

Если вы планируете использовать pthreads и вы планируете передать функцию pass к pthread_create, вы должны malloc/free аргументы, которые вы планируете использовать (даже если функция резьбовая просто нужно один INT).

Использование целочисленного адреса (например, &x), вероятно, неверно, действительно каждая модификация, которую вы будете исполнять на x, повлияет на поведение pass.

+0

У вас не обязательно _have_. Вы также можете сохранить параметры глобальными или даже в стеке, если это одна и та же функция, которая называет 'pthread_create' и' pthread_join', что довольно часто бывает ('main' создает потоки, а затем соединяет их перед выходом). – Shahbaz

+0

@Shahbaz вы могли бы ... но я не буду предлагать новичку C использовать глобальные переменные. Что касается стека, я написал несколько библиотек с использованием pthreds, поэтому я не согласен с тем, что то, что вы описываете, «довольно часто имеет место». Но, конечно, в этом конкретном случае вы можете передать локальный адрес переменной **, если знаете, что делаете **. –

 Смежные вопросы

  • Нет связанных вопросов^_^