相关疑难解决方法(0)

uintptr_t/intptr_t等价于指向函数的指针?

据我所知uintptr_t,并intptr_t可以用来保存任何指针void.因此,这些类型可用于存储指向数据的指针.

在C99或更高版本中,是否有类似的有符号和无符号整数类型能够保存指向函数的指针?

c c99 language-lawyer c11

6
推荐指数
1
解决办法
1071
查看次数

我不知道为什么这个 static_assert() 代码不起作用

这是代码:

#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)

c++ static-assert

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

将整数常量转换为指针

我不明白这行是做什么的:

((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)

c pointers

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

预处理器出现奇怪的错误

目前我对预处理器有一个非常奇怪的错误.我搜索过,找不到任何相关内容,因此想在此发布.以下是我的示例代码

#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

c c++

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

C++字符串散列哈希字符串或内存地址吗?

我之前从未研究过散列算法,我很惊讶当使用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类?

c++ string hash dictionary std

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

请解释有关此过程的错误,以找到最大的指针

最高指针不是通过指针算术不能递增的指针吗?

#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)

c++

0
推荐指数
1
解决办法
82
查看次数

c中的数学的size_t,intptr_t和uintptr_t

在某些代码中使用size_t值时,我遇到了一个小问题.

首先,我想使用size_t,因为它[保证]在大多数平台上都是相同的大小,从32位到64位不应该导致任何问题.

然后我否定了size_t值,得到了一个非常大的数字,回头看,我意识到size_t是无符号的.有intptr_t也是有符号的,但应该用于指针,而uintptr_t是无符号的,也用于指针.

我最终的目标是在c中实现一组简单的定点数学函数.

我的问题是我可以在所有计算中使用uintptr_t像int一样吗?这会导致任何问题吗?

c math size-t

0
推荐指数
1
解决办法
524
查看次数

如果`uintptr_t` 可以用来存储指针和数字,为什么`void*` 不能做同样的事情?

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)

c types pointers casting

0
推荐指数
1
解决办法
90
查看次数

哪种整数类型可以安全且可移植地用于始终保存指针值

哪种整数类型可以安全地用于始终保存指针值?可不可能是std::intptr_t?但我认为int也将始终保存一个指针值并存在于每个构建中,并且如果输入大小不准确,则诸如int32_t或 之类的内容将被更改int64_t

c++

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

标签 统计

c ×5

c++ ×5

pointers ×2

c11 ×1

c99 ×1

casting ×1

dictionary ×1

hash ×1

language-lawyer ×1

math ×1

size-t ×1

static-assert ×1

std ×1

string ×1

types ×1