【问题标题】:Different ways of setting and getting values from void pointer从 void 指针设置和获取值的不同方法
【发布时间】:2016-02-16 14:43:12
【问题描述】:

在浏览一些关于 void 指针的链接时,我在设置和从 void 指针获取值时看到了两种类型,

int main() {
    int i = 5;

    //This is first way.

    void *vPtr = (void *) i;

    //printing value of *vPtr,
    printf("Getting value in first way, %d\n", (int)vPtr);

    //This is second way.
    *vPtr = &i;

    //printing in second way,
    printf("Getting value in second way, %d\n", *((int*)vPtr));
}

它们都将给出相同的值。虽然我对第二种方法的工作原理有所了解,但我并不完全确定第一种方法的工作原理。处理这两者之间的 void 指针时,理想的方法是什么?

对于第一种方法,这是我所指的代码 sn-p。虽然他传递的是 long 类型,但我也可以对 int 做同样的事情。

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 5

void *PrintHello(void *threadid)
{
   long tid;
   tid = (long)threadid;
   printf("Hello World! It's me, thread #%ld!\n", tid);
   pthread_exit(NULL);
}

int main(int argc, char *argv[])
{
   pthread_t threads[NUM_THREADS];
   int rc;
   long t;
   for(t=0;t<NUM_THREADS;t++){
     printf("In main: creating thread %ld\n", t);
     rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
     if (rc){
       printf("ERROR; return code from pthread_create() is %d\n", rc);
       exit(-1);
       }
     }

   /* Last thing that main() should do */
   pthread_exit(NULL);
}

【问题讨论】:

  • 不要将指针转换为int!要打印指针值,请使用正确的格式说明符%p。请阅读有关指针操作、类型转换等的信息。您正在做一些非常奇怪(和错误)的事情。
  • 嗨@Olaf,我已经添加了代码sn-p,其中第一个方法用于设置和获取void指针的值。

标签: c pointers void-pointers


【解决方案1】:

第一种方式使用指针作为整数的存储空间;第二种方式单独存储整数,并使用void*指针指向它。

指针能够保存内存地址。由于内存地址本质上是数值,因此指针能够存储数字。然而,这些数字的范围取决于系统。例如,您可以将指针重新解释为整数,方法是使用 %p 格式说明符将指针传递给 printfprintf 产生的数值是系统定义的,但是你会得到一些打印出来的数字作为你的指针。

保证第二种方法有效。而且,如果你改变i,线程看到的值也会改变。

这意味着指针指向的值必须在线程可以访问它的持续时间内保持不变。这意味着如果您要更改线程代码以使用第二种方法,则单个t 是不够的;您必须创建一个 NUM_THREADS 元素数组,并将每个线程的地址传递给不同的元素。

第二种方法可能适用于大多数硬件,因为int 通常适合指针的空间。但是,C99 标准对此不做任何保证。进行分配后,对i 的更改不会影响线程看到的整数值。

您可以在this Q&A 中找到有关将int 转换为void* 的主题的更多信息。

【讨论】:

    【解决方案2】:
    void *vPtr = (void *) i;
    

    解释 i 为指向某物的指针。在您的示例中,vPtr 现在将指向地址 0x00000005

     *vPtr = &i;
    

    这需要i地址

    这一切都取决于你想做什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-28
      • 2015-01-09
      • 2013-12-25
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      • 2014-05-13
      • 2014-05-30
      相关资源
      最近更新 更多