我正在阅读Ogre3D实现中的一些代码,我无法理解void *类型变量的含义.指针void在C++中意味着什么?
在之前的一个问题中,我询问了类型转换指针,但是针对使用C++分配系统而不是mallocs的更好解决方案.(我正在将一些C代码转换为C++)
但是,我仍然遇到类似功能的问题:
我变了:
tmp = malloc(sizeof(char*) * mtmp); --> tmp = new char*[mtmp];
Run Code Online (Sandbox Code Playgroud)
和
free(tmp) --> delete [] tmp;
Run Code Online (Sandbox Code Playgroud)
但是,我在以下函数中如何处理realloc:
char* space_getRndPlanet (void)
{
int i,j;
char **tmp;
int ntmp;
int mtmp;
char *res;
ntmp = 0;
mtmp = CHUNK_SIZE;
//tmp = malloc(sizeof(char*) * mtmp); <-- replaced with line below
tmp = new char*[mtmp];
for (i=0; i<systems_nstack; i++)
for (j=0; j<systems_stack[i].nplanets; j++) {
if(systems_stack[i].planets[j]->real == ASSET_REAL) {
ntmp++;
if (ntmp > mtmp) { /* need more space */
mtmp += …Run Code Online (Sandbox Code Playgroud) 可能重复:
为什么函数指针和数据指针在C/C++中不兼容?
在dlsym的手册页中,提供了以下代码段.
double (*cosine)(double);
handle = dlopen("libm.so", RTLD_LAZY);
/* Writing: cosine = (double (*)(double)) dlsym(handle, "cos");
would seem more natural, but the C99 standard leaves
casting from "void *" to a function pointer undefined.
The assignment used below is the POSIX.1-2003 (Technical
Corrigendum 1) workaround; see the Rationale for the
POSIX specification of dlsym(). */
*(void **) (&cosine) = dlsym(handle, "cos");
Run Code Online (Sandbox Code Playgroud)
我查看了相关的spec页面,但仍然无法理解不允许从void指针转换为函数指针的原因.虚假指针应该足够大,以容纳所有类型的指针.如果是这样,为什么不定义这个铸件呢?
在更好地了解所给出的答案,希望这个帖子,可以有人请向我解释,如果下面的循环缓冲区的实现是可能的,如果没有,为什么没有.
#define CB_TYPE_CHAR 0
#define CB_TYPE_FLOAT 1
...
typedef struct CBUFF
{
uint16 total; /* Total number of array elements */
uint16 size; /* Size of each array element */
uint16 type; /* Array element type */
uint16 used; /* Number of array elements in use */
uint16 start; /* Array index of first unread element */
void *elements; /* Pointer to array of elements */
} CBUFF;
...
void cbRead(CBUFF *buffer, void *element)
{
if (buffer->type == …Run Code Online (Sandbox Code Playgroud) 为什么通过void*未定义的行为而不是编译错误来删除对象?
void foo(void* p) {
delete p;
}
Run Code Online (Sandbox Code Playgroud)
这段代码编译并生成代码,虽然gcc和clang上有警告(令人惊讶的是,ICC没有发出警告):
:2:5:警告:无法删除带有指针''''''的类型'void*'[-Wdelete-incomplete]
为什么不是简单的格式错误的程序,语法无效?貌似标准没有花太多时间就可以了,在说[expr.delete]这
这意味着无法使用void*类型的指针删除对象,因为void不是对象类型.
我有什么理由不知道为什么这不会触发硬编译错误?
c++ void-pointers undefined-behavior language-lawyer delete-operator
我有一个小问题:如何找出C++指针的类型?
我经常在我的控制台程序中使用一个小函数来收集输入,看起来像这样:
void query(string what-to-ask, [insert datatype here] * input)
Run Code Online (Sandbox Code Playgroud)
我想创建一个泛型表单,使用void指针,但我不能cin一个void指针,所以如何找出它的类型,所以我可以投射它?
我试图在我的Swift类中使用NSObject(NSKeyValueObserving),但我遇到了类型问题.Xcode抱怨它不理解以下代码中'context'参数的CMutableVoidPointer类型:
override func observeValueForKeyPath(keyPath: String!, ofObject object: AnyObject!, change: NSDictionary!, context: CMutableVoidPointer)
Run Code Online (Sandbox Code Playgroud)
我使用CMutableVoidPointer,因为Objective-C定义将'context'参数键入为void*.
我在编译时遇到的确切错误是:"使用未声明的类型'CMutableVoidPointer'".
我正在使用Xcode Beta 3.
任何帮助,将不胜感激.
好吧,我最初严重搞砸了我对这个问题的描述(自从我认真编写C++代码以来我已经超过一年了,我对纯C的经验非常有限),让我们再试一次.
编写一些C代码以期望您执行以下操作
void* p;
create_new_thing(&p); //p is now a new thing
do_stuff_to_thing(p); //something happened to p
Run Code Online (Sandbox Code Playgroud)
我的问题是如何p在Julia中创建对象.现在我相信答案
p = Ref{Ptr{Void}}()
ccall((:create_new_thing, :lib), Void, (Ptr{Ptr{Void}},), p)
ccall((:do_stuff_to_thing, :lib), Void, (Ptr{Void},), p)
Run Code Online (Sandbox Code Playgroud)
此外,我相信相同的代码,但p声明相反p = Array(Ptr{Void}, 1)也有效.
然而,我发现整个之间的区别Ref,并Ptr在朱莉娅非常混乱,主要是因为他们似乎的方式,我不能跟踪相互之间进行转换得到.
我是C新手,但多年来一直是程序员,所以我试图从2008年开始沿着斯坦福大学的课程学习C,并在C.中的向量上做作业3.
它基本上只是一个通用数组,所以数据作为一个结构保存在一个结构中void *.编译器标志-Wpointer-arith打开,所以我不能算术(我明白原因).
数据周围的结构必须不知道数据的类型,因此它对调用者来说是通用的.
为简化起见,我正在尝试以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
void *data;
int aindex;
int elemSize;
} trial;
void init(trial *vector, int elemSize)
{
vector->aindex = 0;
vector->elemSize = elemSize;
vector->data = malloc(10 * elemSize);
}
void add(trial *vector, const void *elemAddr)
{
if (vector->aindex != 0)
vector->data = (char *)vector->data + vector->elemSize;
vector->aindex++;
memcpy(vector->data, elemAddr, sizeof(int));
}
int main()
{
trial vector;
init(&vector, sizeof(int));
for …Run Code Online (Sandbox Code Playgroud) 以下代码可在VSC ++ 2017中编译且没有任何错误,并且不会在gcc 7.3.0(error: invalid static_cast from type ‘int(int)’ to type ‘void*’
void* p = static_cast<void*>(func))中编译
#include <iostream>
int func(int x) { return 2 * x; }
int main() {
void* p = static_cast<void*>(func);
return 0;
}
Run Code Online (Sandbox Code Playgroud) void-pointers ×10
c ×5
c++ ×5
arrays ×1
casting ×1
dereference ×1
ios ×1
julia ×1
memcpy ×1
objective-c ×1
pointers ×1
realloc ×1
static-cast ×1
swift ×1
valgrind ×1
void ×1