标签: void-pointers

在C中的struct中"解除引用`void*'指针"警告的解决方案?

我试图创建一个伪超级结构来打印结构数组.我的基本结构如下.

/* Type 10 Count */
typedef struct _T10CNT
{
    int _cnt[20];
} T10CNT;

...

/* Type 20 Count */
typedef struct _T20CNT
{
    long _cnt[20];
} T20CNT;
...
Run Code Online (Sandbox Code Playgroud)

我创建了下面的结构来打印上面提到的结构数组.编译下面的代码片段时,我解除了引用void指针错误.

typedef struct _CMNCNT
{
    long  _cnt[3];
} CMNCNT;

static int printCommonStatistics(void *cmncntin, int cmncnt_nelem, int cmncnt_elmsize)
{
    int ii;
    for(ii=0; ii<cmncnt_nelem; ii++)
    {
        CMNCNT *cmncnt = (CMNCNT *)&cmncntin[ii*cmncnt_elmsize];
        fprintf(stout,"STATISTICS_INP: %d\n",cmncnt->_cnt[0]);
        fprintf(stout,"STATISTICS_OUT: %d\n",cmncnt->_cnt[1]); 
        fprintf(stout,"STATISTICS_ERR: %d\n",cmncnt->_cnt[2]);
    }
    return SUCCESS;
}

T10CNT struct_array[10];
...
printCommonStatistics(struct_array, NELEM(struct_array), sizeof(struct_array[0]);
...
Run Code Online (Sandbox Code Playgroud)

我的目的是有一个共同的功能来打印所有数组.请让我知道使用它的正确方法.

提前感谢您的帮助.

编辑:参数名称从cmncnt更改为cmncntin.对不起,这是错误的错误.

谢谢,Mathew Liju

c struct void-pointers

2
推荐指数
1
解决办法
1万
查看次数

void时指针算法的大小未知

在Visual Studio C++版本9(也可能是其他版本)中,以下代码:

int a = sizeof(void);
void const *b = static_cast<void const *>("hello world");
b += 6;
Run Code Online (Sandbox Code Playgroud)

生成这些 错误:

error C2070: 'void': illegal sizeof operand
error C2036: 'const void *' : unknown size
Run Code Online (Sandbox Code Playgroud)

此代码在GCC下工作,GCC sizeof(void)视为1.

是否存在一些解决此限制的方法,因为char *为了指针运算的目的而明确地进行转换会增加混淆(void *被公认并被用作原始内存的无类型指针).

Update0

  • 请注意,我很清楚标准的存在.
  • 想做原始指针算术.
  • sizeof(void)认为我很清楚这不是1导致问题的原因.
  • 代码示例仅用于演示生成错误所需的内容.
  • 我知道这不是一种"正常"的使用方式void,但这是C,这些事情都会发生.
  • 是的,人们需要在低级别这样做.我不是在追求原因,我是在追求如何.如果你想知道原因,请查看一些内核源代码或友好的glibc.

UPDATE1

看来这个问题引起了很大的混乱.现在的问题不是关于为什么sizeof(void) == 1不标准,但做什么时,它不是.

在要进行单字节指针运算的情况下,事实证明,转换为char *正确的答案,不是因为*(void *)没有大小,而是因为标准实际上保证了这*(char *) …

c gcc void-pointers pointer-arithmetic visual-studio

2
推荐指数
3
解决办法
8868
查看次数

指针上有趣的问题..请帮助

#include<iostream>
#include<conio.h>

using namespace std;
int main()
{
           int x = 65;
           int *ptr = &x;
           char * a= (char *)ptr;
           cout<<(int)*(a);
           getch();return 0;
}           
Run Code Online (Sandbox Code Playgroud)

Sixeof(ptr)和Sizeof(a)显示4
Sizeof(int)显示4和sizeof(char)显示1
所以65存储在4个字节中,即
00000000 00000000 00000000 01000001,第一个字节的地址存储在ptr中

在上面的代码中,我有一个类型将int*转换为char*,以打印存储在x(int)第一个字节中的值.

因此,在类型转换后,"a"存储第一个字节地址,即包含在ptr中,现在在显示(int)*a时,它应该只考虑显示值的第一个字节.但输出是65而不是0(第一个字节值)..我哪里错了..?

我学到的是

char * ptr1;
ptr1++;  //Ptr1 goes to the next byte..*ptr1 will display only 1 byte value

int  * ptr2;
ptr1++;  //Ptr2 goes to the next 4 byte..*ptr2 will display value conmtain in 4 bytes
Run Code Online (Sandbox Code Playgroud)

PS - 我正在研究Dev-C++

c++ void-pointers

2
推荐指数
1
解决办法
164
查看次数

获取对象void*的大小指向

#define BOOST_TEST_MODULE MemoryLeakTest
#include <boost/test/unit_test.hpp>

#include <iostream>
using namespace std;

BOOST_AUTO_TEST_CASE( MemoryLeakTest)
{
    double* n1 = new double(100);
    void* v1 = n1;
    cout << sizeof(v1) << endl;
    delete v1;
}
Run Code Online (Sandbox Code Playgroud)

此代码将完美地工作,没有任何错误泄漏.但是我希望能够得到对象的大小.void*我会想象有一种方法,因为delete语句知道对象v1指向的大小,以便它可以删除它所以它必须存储一些地方.

c++ sizeof void-pointers

2
推荐指数
1
解决办法
4431
查看次数

这个宣言有什么问题?

它是这样的,第四个,第五个:

void * copyFile( void * arg )
{
    struct dirent *ent = (dirent *)arg;
}
Run Code Online (Sandbox Code Playgroud)

GCC告诉我'dirent' undeclared (first use in this function).

在你问之前,这个论点是void *因为它被传递给了一个pthread,而这正是我被教导的方式,而且因为这是我第一次线程化(它很痛),我只是在做我被告知的事情因为我在这里的理解充其量是微弱的.

c declaration pthreads void-pointers

2
推荐指数
1
解决办法
79
查看次数

void数组的指针

我有一个void-Pointers数组,想要访问元素(初始化它们),但它不起作用:

void* anyptr = ...; //a pointer to something
void* arr = (void*)malloc(sizeof(void*)*10);

int i=0;
for(i=0; i<10; i++)
   *(arr+i) = anyptr; //dont work, (arr+n) = anyptr; doesn´t work too
Run Code Online (Sandbox Code Playgroud)

我想,这不起作用的原因是左侧是元素i的结果.但我不知道如何做到这一点

c arrays pointers void-pointers

2
推荐指数
2
解决办法
4万
查看次数

C,错误:表达式必须是可修改的左值

我有以下代码:

#define NULL ((void*)0)
void* Globalptr = NULL;
void func(ptrtype* input)
{
 ((ptrtype*)Globalptr) = input;
}
Run Code Online (Sandbox Code Playgroud)

我在网上得到错误((ptrtype*)Globalptr) = input;说"表达式必须是可修改的左值"

c pointers casting void-pointers

2
推荐指数
1
解决办法
3万
查看次数

为什么有必要转换为void**(例如在cudaMalloc调用中)?

cudaMalloc()函数使用以下定义:

cudaMalloc ( 
  void ** devPtr, 
  size_t size)
Run Code Online (Sandbox Code Playgroud)

这里这里的响应很好地解释了为什么应该定义函数来接受指向指针的指针.

但是,我不太清楚为什么我们需要在调用函数类型为void**时输入我们提供的参数.例如,在函数调用中:

catch_status = cudaMalloc((void**)&device_array, num_bytes);
Run Code Online (Sandbox Code Playgroud)

呈现在这里.

据我了解,定义一个接受void类型的函数可以提供更大的灵活性.即看看cudaMalloc()函数的定义,我将其解释为它可以接受指向任何类型对象的指针.因此,为什么&device_array在调用函数时需要输入强制转换(在上面的例子中).(这种类型转换的语法在cudaMalloc()我在整个网络中看到的例子中似乎非常普遍).只要&device_array满足它是"指向任何类型数据的指针"的条件,就不足以(a)满足参数cudaMalloc()接受的函数定义和(b)完成我们的编程目标吗?

我在这里错过了什么?

c pointers cuda void-pointers

2
推荐指数
1
解决办法
1517
查看次数

除了使代码更加惯用之外,C的无效*是否可以用于任何其他目的?

C是否void*以编译器优化等形式提供了一些好处,或者它只是一个惯用的等价物char*?也就是说,如果void*C标准库中的每一个都被替换char*,那么除了代码易读性之外还会有任何损坏吗?

c void-pointers

2
推荐指数
1
解决办法
131
查看次数

向多个继承的类的超类强制转换void *不会调用正确的方法

我将指向一组异构对象的指针列表存储在容器中,并使用字符串来标识它们。关于此操作的安全性,我已经在这里进行了讨论,我对此表示满意。

问题在于,当该类具有多个继承并且我尝试将相同的指针强制转换为一个或另一个超级类时,似乎第二次强制转换失败。

这是一个例子:

#include <iostream>
#include <map>
using namespace std;

class A {
public:
  virtual void hello() = 0;
};

class B {
public:
  virtual void goodbye() = 0;
};

class C : public A,
          public B
{
public:
  void hello() override {
    std::cout << "C says: Hello World!" << std::endl;
  }
  void goodbye() override {
    std::cout << "C says: GoodBye World!" << std::endl;
  }
};

class D : public A {
public:
  void hello() override {
    std::cout …
Run Code Online (Sandbox Code Playgroud)

c++ casting multiple-inheritance void-pointers

2
推荐指数
1
解决办法
84
查看次数