我不明白mystery下面的成员是什么类型的财产:
typedef struct _myobject
{
long number;
void *mystery;
} t_myobject;
Run Code Online (Sandbox Code Playgroud)
这个会员是什么样的会员void?这占用了多少内存?我可以在哪里获得有关该功能的更多信息(例如,为什么要使用会员void?)
编辑--更新标题说无效*
我正在为 Linux 内核编写一个模块,我想int在文件私有数据中存储一个值。
本质上,我所做的是:file->private_data = (void*) x
其中 x 是某个int值。
现在,我想将 int 作为值访问回来。
使用在编译过程中int val = (int) file->private_data会发出cast from pointer to integer of different size警告,这是合理的,因为它可能会在 64 位系统上引起问题。
我也无法使用uintptr_t,因为我在内核中工作并且无权访问库。
使用起来double似乎不太合适。
我的问题是:这样做的最佳做法应该是什么?
请考虑以下代码:
int f(int i){return i*i;};
int main() {
void* p = static_cast<void*>(&f);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
正如您在此处看到的,代码无法编译。为什么在 C++ 中不允许static_cast从int (*)(int)到void*?
我正在尝试构建一个可以在没有任何动态内存分配的情况下填充结构的通用函数。
以下代码是我正在尝试做的事情的一个简单示例。此代码不会编译为incomplete type 'void' is not assignable.
请注意,这是一个突出我的问题的玩具示例。我真的不想转换颜色;我只想强调结构在数据类型和大小上会有所不同。
#include <stdio.h>
typedef struct {
int r;
int g;
int b;
} rgb_t;
typedef struct {
float c;
float m;
float y;
float k;
} cmyk_t;
typedef enum { RGB, CMYK } color_t;
void convert_hex_to_color(long hex, color_t colorType, void* const out) {
if (colorType == RGB) {
rgb_t temp = { 0 };
// Insert some conversion math here....
temp.r = 1;
temp.g = 2;
temp.b = 3; …Run Code Online (Sandbox Code Playgroud) 我有一个空指针作为函数的参数。它当前指向一个int。当我尝试释放它时,它返回一个总线错误。我应该释放空指针吗?如果是这样,我该怎么做?
有以下 C-Function 以 void 指针作为参数:
int read(void *buf, size_t num);
Run Code Online (Sandbox Code Playgroud)
int => 返回读取操作是否成功。
void *buf => c void 无符号字节缓冲区指针作为函数参数。
size_t num => 应填充的字节缓冲区的大小。
目前我有以下 Ada 实现:
with Ada.Text_IO;
with System;
with Interfaces.C;
use Ada.Text_IO;
use Interfaces.C;
procedure Main is
-- Imported C function
function Read(Buf:System.Address; Num:int) return int;
pragma Import(C, Read, "read");
-- Byte Array Type
type Byte_Type is mod 2**8;
for Byte_Type'Size use 8;
type Byte_Array_Type is array(Positive range <>) of Byte_Type;
-- Initialize
Buffer_Check:int;
Buffer_Size:Positive:=10;
Buffer_Array:Byte_Array_Type(1 .. Buffer_Size):=(others …Run Code Online (Sandbox Code Playgroud) void 和 char 指针是否保证具有相同的内存表示形式?
换句话说,执行以下命令后:
char a = 'z';
void *b = &a;
char *c;
memcpy(&c, &b, sizeof(b));
Run Code Online (Sandbox Code Playgroud)
我可以确定*c == 'z'(没有未定义的行为等)吗?
在 Keil uVision 的 STM32 开发板示例中,我发现以下函数:
__NO_RETURN static void thrLED(void *argument) {
...
(void)argument;
...
}
Run Code Online (Sandbox Code Playgroud)
是什么意思(void)argument;?
据我所知,“参数”是一个 void 类型的指针,作为函数“thrLED”的参数。但我不知道这条线在做什么。
我正在编写一个访问函数,它返回一个指向内部缓冲区的指针,我想向我的函数用户暗示他们不应该更新指向的对象.一个非常人为的例子是:
void myAccessFunc(bool string, void* p, size_t* len)
{
static const char* s = "aha!";
static const int i = 123;
if (string) {
*(char**)p = &s;
*len = strlen(s);
}
else {
*(int**)p = &i;
*len = sizeof(i);
}
}
char* s;
size_t bytes;
myAccessFunc(true,&s, &bytes);
printf("Got '%s'\n", s);
Run Code Online (Sandbox Code Playgroud)
是的,我知道这看起来很好看.
我想要防止的是:
char* s;
size_t bytes;
myAccessFunc(true,&s,&bytes);
s[4] = '?';
Run Code Online (Sandbox Code Playgroud)
我知道我不能完全阻止它但我至少喜欢编译器警告提示用户他们不应该这样做.如果他们投了我的指针,那就是他们的问题.有没有const和void的组合和*会这样做?我尝试过类似的东西:
void myAccessFunc(bool string, const void** p, size_t* len);
Run Code Online (Sandbox Code Playgroud)
但它似乎消除了指针的无效性,因此调用者必须这样做:
const void* p;
size_t bytes;
myAccessFunc(true, &p, &bytes);
Run Code Online (Sandbox Code Playgroud)
要么
const …Run Code Online (Sandbox Code Playgroud) 注意:这不是标题中带有此名称的十亿和一个问题的副本.这与指针和非常奇怪的东西有关,而不是偶然=而不是==.
我有一个C++函数,我有一个void*名为的参数out.我有这条线:
(char*)out=new char[*size];
Run Code Online (Sandbox Code Playgroud)
凡size在uint32_t*.编译器抱怨:
fundemental_bin_types.h:55:32: error: lvalue required as left operand of assignment
Run Code Online (Sandbox Code Playgroud)
怎么了?