标签: void-pointers

如何使 void(*)(...) 作为结构成员

获取演示代码

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

typedef struct Student
{
    public: 
        Student(){}
        ~Student(){}
        static void print(int a,int b){printf("age is a\n");}
}Student;

int main(){
    void (*p)(int, int) = &Student::print;

    vector<void(*)(int,int)> tt;
    tt.push_back(p);
    tt[0](1,1);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我想将 void(*)(int,int) 作为结构成员时,例如

struct void_func_st{
    void(*)(int,int) f;
    int a;
};
Run Code Online (Sandbox Code Playgroud)

代码错误。我不知道该结构是否可以实际制作,因为我不熟悉 void(*)(...) 的工作原理。或者我只是没有找到使 void(*)(...) 作为结构成员的正确方法。有人可以给一些建议吗?

c++ struct void-pointers

0
推荐指数
2
解决办法
324
查看次数

为什么在这个简单的例子中传递一个简单的指针不起作用

为什么修改ptr对vector没有影响?我试图通过f函数改变值.

void f(int *ptr, int size, int value){
    ptr=(int* )malloc(sizeof(int));
    if(ptr!=NULL){
        int i;
        for(i=0;i<size;i++)
            *(ptr + i) = value;
        }

}

int main (void)
{
  int *vector = NULL;
  f(&vector, 3, 324);
    printf("%p\n", vector);

}
Run Code Online (Sandbox Code Playgroud)

c pointers void-pointers

-1
推荐指数
1
解决办法
70
查看次数

为什么malloc返回的指针在使用之前不需要转换,与其他(void*)指针不同

编译器(这里我正在考虑gcc,但我想它可能是任何C编译器)是否关心变量的来源?如果指针来自malloc,为什么它会有区别?它只是某些编译器使用的优化还是在C标准中提到的?

c malloc void-pointers

-1
推荐指数
1
解决办法
60
查看次数

键入一个指向int的void指针,内存分配不足

我正在初始化一个带有1个字节内存的void指针,并将其类型转换为int指针,并取消引用它,给它一个值3(需要4个字节),但运行正常.这不应该导致错误或导致像OOM这样的运行时异常吗?

void* record = malloc(1);
int i=3;
*((int*)record) = 3;
Run Code Online (Sandbox Code Playgroud)

c pointers void-pointers

-1
推荐指数
1
解决办法
60
查看次数

在C中使用void*指针的缺点

void *在C中使用有许多缺点(与内存相关,类型相关,效率明智......).尽管如此,我们还是使用它们来提供灵活性.

列出使用的缺点/缺点void *(以及C中的首选解决方案 - 如果可能的话).

编辑: 请通过以下链接:http: //attractivechaos.wordpress.com/2008/10/02/using-void-in-generic-c-programming-may-be-inefficient/

c void-pointers

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

在C(GCC)中使用char*

我有以下代码

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


int main()
{
  char *A, B, C, D;
  printf("Enter name A:");
  scanf("%s", &A);


  printf("Enter name B:");
  scanf("%s", &B);

  printf("Enter name C:");
  scanf("%s", &C);

  printf("Enter name D:");
  scanf("%s", &D);

  printf("%s, %s, %s, %s \n", A, B, C, D);    

  return 1;
}
Run Code Online (Sandbox Code Playgroud)

它接受四个字符串,但在打印出来之前会崩溃吗?

我想做的第二件事是将这些字符串(A,B,C,D)传递给接受void指针的函数,我是否必须先将它们转换为void指针?

c gcc void-pointers

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

交换void*数组无法正常工作

我有一个复数的数组,我只想在两个元素之间交换.但是,我想实现未知类型的交换(使用void*).所以我使用我在这里看到的第一个交换实现编写了以下代码:

#include<stdio.h>

typedef struct complex complex;

struct complex {
    int real;
    int img;
};

void swap(void *arr[], int i, int j)
{
    void *temp;
    temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

void printComplexArray(complex* cArr, size_t len)
{
    int i;
    for (i = 0; i < len; i++)
    {
        printf("Cell %d : real- %d , img- %d\n", i, cArr[i].real, cArr[i].img);
    }
}

void main(void)
{
    complex cArr[] = { { 22, 3 },{ 1, 13 },{ …
Run Code Online (Sandbox Code Playgroud)

c arrays void-pointers

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

从void指针中获取一个指向short的int

我有一个库的返回值,它是一个void指针.我知道它指的是一个简短的int; 我尝试以下列方式获取int值(用简单的赋值替换函数调用a void *):

short n = 1;
void* s = &n;
int k = *(int*)s;
Run Code Online (Sandbox Code Playgroud)

我尝试转换一个指向一个地址的空指针,其中有一个短的,我试图将指针转换为指向一个int,当我这样做时,输出变成一个垃圾值.虽然我理解为什么它表现得像我不知道是否有解决方案.

c++ pointers type-conversion void-pointers

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

当"this"关键字在void指针中进行类型转换时,这些行的含义是什么

我正在使用由其他人编码的C++代码.我想知道这行代码中发生了什么.

tplayer是一个数组,OnTickContext是一个bool变量.

 tPlayers[i].OnTickContext = (void*)this;
Run Code Online (Sandbox Code Playgroud)

c++ void-pointers

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

通过在C中更改函数调用来节省代码空间

我正在调用一个通过指针参数返回变量的函数.我不关心这个参数的返回值,也不想让虚拟变量传递给函数.举一个简单的例子,假设函数如下,我不关心,也不想为参数"d"创建一个虚拟变量.

void foo(int a, int b, int* c, int* d)
{
*c = a+b;
*d = a+b+*c;
}
Run Code Online (Sandbox Code Playgroud)

据我所知,NULL指针理论上是一个指向不是任何对象或函数地址的位置的指针.如果将NULL定义如下,那么在此函数中将NULL传递给"d"是否正确?或者这是否会改变内存中第0个元素的内容?

#define NULL ((void *)0)
Run Code Online (Sandbox Code Playgroud)

目标设备是MSP430,我正在使用IAR C. 没有使用操作系统,因此没有实现内存管理

编辑:请注意,我不想创建虚拟变量.此外,如果有一种方法可以欺骗编译器在不改变函数定义的情况下优化"d"参数,这是更可取的.

编辑#2:我宁愿不在函数调用中使用&运算符,因为它会生成我不想生成的低效代码

编辑#3:对于那些在我谈论&运算符时不相信我的人......编译器手册指出"避免使用&运算符来获取局部变量的地址.这主要有两个原因:效率低.首先,变量必须放在内存中,因此不能放在处理器寄存器中.这会导致代码越来越大.其次,优化器不能再认为局部变量不受函数调用的影响."

c null void-pointers

-3
推荐指数
1
解决办法
254
查看次数

使用delete运算符删除void指针

什么错误的代码.应该是什么.因为它抛出一个错误.运算符'delete',应用于void*参数.

int i;
void *ptr = &i;

delete ptr;
Run Code Online (Sandbox Code Playgroud)

c++ void-pointers

-4
推荐指数
1
解决办法
5105
查看次数

C语言是否仅为void指针指定任何隐式初始化?

这是我的代码:

int main()
{
    int *p;
    void *x;
    printf("%p\n", p);
    printf("%p\n", x);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

将打印:

koraytugay $ ./a.out
0x7fff53b35ad0
0x0
koraytugay $ ./a.out
0x7fff5803fad0
0x0
koraytugay $ ./a.out
0x7fff512c9ad0
0x0
koraytugay $ ./a.out
0x7fff55213ad0
0x0
koraytugay $ ./a.out
0x7fff52dbdad0
0x0

这种行为在语言中有什么解释吗?

c initialization void-pointers

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

void*和void**之间的区别**

除了能够解除引用之外void**,我不理解以下内容:

void * foo, **bar;
foo++;//error
bar++;//no error
Run Code Online (Sandbox Code Playgroud)

为什么不是第一次工作而第二次工作呢?有什么不同?

c void-pointers pointer-arithmetic

-5
推荐指数
1
解决办法
211
查看次数