据我所知uintptr_t,并intptr_t可以用来保存任何指针void.因此,这些类型可用于存储指向数据的指针.
在C99或更高版本中,是否有类似的有符号和无符号整数类型能够保存指向函数的指针?
这是代码:
#pragma once
#include <stdint.h>
namespace Detours
{
static_assert(sizeof(uintptr_t) == sizeof(void *));
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误消息:
Error (active) E2783 expected a comma (the one-argument version of static_assert is not enabled in this mode)
Run Code Online (Sandbox Code Playgroud) 我不明白这行是做什么的:
((struct Example*) 0x10000)
Run Code Online (Sandbox Code Playgroud)
我写了一个测试程序:
#include <stdio.h>
struct Elf{
int bla;
char bla2;
};
int main(){
struct Elf *elfPtr;
printf("Before casting: %p\n", elfPtr);
elfPtr = ((struct Elf *)0x10000);
printf("After casting: %p\n", elfPtr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
在投射之前:0xb776dff4
投射后:0x10000
这条线只做这个吗?
elfPtr = 0x10000
Run Code Online (Sandbox Code Playgroud) 目前我对预处理器有一个非常奇怪的错误.我搜索过,找不到任何相关内容,因此想在此发布.以下是我的示例代码
#include <stdio.h>
#define DDR_BASEADDR 0x000000000U + 128*1024*1024
int main()
{
uint32_t* test2 = (uint32_t*) DDR_BASEADDR;
uint32_t whatIsThis = DDR_BASEADDR;
uint32_t* test3 = (uint32_t*) whatIsThis;
printf( "%x %x %x %x\n\r", DDR_BASEADDR, test2, test3, whatIsThis);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这段代码的输出应该都是0x8000000.但是,产出是:8000000 20000000 8000000 8000000.
我相信这是不是导致此问题的数据类型,因为它也将出现,即使我改uint32_t* test2 = (uint32_t*) DDR_BASEADDR;到int32_t* test2 = (int32_t*) DDR_BASEADDR;
我在Zedboard的ARM A9和C++在线编译器上测试了这一点,得到了相同的结果.感谢您的时间和精力.
Thang Tran
我之前从未研究过散列算法,我很惊讶当使用std :: unordered_map时我发现散列函数(我认为)实际上是散列内存地址,而不是字符串.如果我错了,请纠正我,但我发现这只是通过更改原始字符串并将其添加到我的unordered_map,并且当内存地址(指针)相同时它从未添加任何内容.
在下面的例子中,是否添加新密钥取决于std :: string是否重新分配到另一个内存区域:
std::unordered_map<const char*, char*> myMap;
std::string myString = "Key1";
myMap[myString.c_str()] = "someVal"; // <--- Adds a new key, size is now 1
myString = "Key2";
myMap[myString.c_str()] = "someVal"; // <--- Doesn't add a new key "Key2" didn't need to be reallocated
Run Code Online (Sandbox Code Playgroud)
但是当我在更改字符串时直接在模板中使用std :: string时,它会向我的地图添加另一个键,这样就表明unordered_map模板专门用于std :: string并实际散列字符串本身?如果它必须散列字符串本身,这会慢吗?
我提出这个问题的原因是,我所看到的教程似乎传达了这样的含义,即实际的字符串本身会被哈希化.即使在Stack Overflow上,我也看到人们会说出"由于性能原因,不需要检查整个字符串,只需要检查所需的字符数"(释义).
好吧,我得到的印象显然是字符串文字和指向字符串的指针,但不是std :: string类?
最高指针不是通过指针算术不能递增的指针吗?
#include <iostream>
int main()
{
// Find the largest pointer
int x = 0;
int* px = &x;
while ((px+1) != px)
++px;
std::cout << "The largest pointer is: " << px;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
产量
Timeout
Run Code Online (Sandbox Code Playgroud) 在某些代码中使用size_t值时,我遇到了一个小问题.
首先,我想使用size_t,因为它[保证]在大多数平台上都是相同的大小,从32位到64位不应该导致任何问题.
然后我否定了size_t值,得到了一个非常大的数字,回头看,我意识到size_t是无符号的.有intptr_t也是有符号的,但应该用于指针,而uintptr_t是无符号的,也用于指针.
我最终的目标是在c中实现一组简单的定点数学函数.
我的问题是我可以在所有计算中使用uintptr_t像int一样吗?这会导致任何问题吗?
Swift 或 Rust 等语言中的枚举支持一种混合的“选择加数据”机制,这样我就可以定义如下类型:
enum SomeOption {
None,
Index(int),
Key(string),
Callback(fn),
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我是用C实现这一点,我的理解是,这样的事情就不会是有效的:
enum SomeOption {
None,
Index(int),
Key(string),
Callback(fn),
}
Run Code Online (Sandbox Code Playgroud)
我不确定这样做到底有什么风险,但是根据例如可以指针存储值以及空指针的用途是什么?我应该存储在 avoid*中的唯一内容是实际地址和NULL. [旁白:请对在 a中存储回调函数指针的单独问题视而不见void*,我在编写此示例时忘记了这个问题。]
我想更合适的方法是使用联合,例如:
typedef struct {
my_choice value_type;
union {
int number_value;
char* string_value;
void* pointer_value;
};
} my_option;
Run Code Online (Sandbox Code Playgroud)
……无论如何,这可能更好。但我特别想知道void* valueversion的无效性。如果我是(而不是union解决)简单地替代uintptr_t的地方void*?
typedef struct {
my_choice value_type;
uintptr_t value;
} …Run Code Online (Sandbox Code Playgroud) 哪种整数类型可以安全地用于始终保存指针值?可不可能是std::intptr_t?但我认为int也将始终保存一个指针值并存在于每个构建中,并且如果输入大小不准确,则诸如int32_t或 之类的内容将被更改int64_t