相关疑难解决方法(0)

NULL总是假吗?

假设NULL在C 中始终转换为false 是否安全?

void *somePtr = NULL;

if (!somePtr) {
  /* This will always be executed? */
}
Run Code Online (Sandbox Code Playgroud)

或者应该明确检查价值NULL

c null pointers

62
推荐指数
6
解决办法
4万
查看次数

我可以访问地址零吗?

常量0用作C和C++中的空指针.但随着问题"指向一个特定的固定地址 "似乎有一些可能使用分配固定地址.在任何系统中,对于访问地址0的任何低级任务,是否有任何可能的需求?

如果有,那怎么解决0为空指针而全部?

如果没有,是什么让它确定没有这种需要?

c c++ memory pointers

53
推荐指数
8
解决办法
7905
查看次数

malloc如何理解对齐?

以下摘录自此处

pw = (widget *)malloc(sizeof(widget));
Run Code Online (Sandbox Code Playgroud)

分配原始存储.实际上,malloc调用分配的存储空间足够大并且适当地对齐以容纳类型为widget 的对象

他还说,从草本植物中看到快速的pImpl,他说:

对齐.任何内存对齐.保证通过new或malloc动态分配的任何内存都可以正确地对齐任何类型的对象,但是没有动态分配的缓冲区没有这样的保证

我对此感到好奇,malloc如何知道自定义类型的对齐方式?

c c++ memory-alignment

47
推荐指数
3
解决办法
2万
查看次数

指针(地址)可以是负数吗?

我有一个函数,我希望能够返回失败未初始化的特殊值(它返回成功指针).

目前它为失败返回NULL,为未初始化返回-1,这似乎有效......但我可能会欺骗系统.iirc,地址总是积极的,不是吗?(虽然由于编译器允许我将地址设置为-1,这看起来很奇怪).

[更新] 我有另一个想法(如果-1是有风险的)是malloc一个char @全局范围,并使用该地址作为哨兵.

c signed pointers return-value

35
推荐指数
4
解决办法
2万
查看次数

((void*) - 1)是一个有效的地址吗?

来自Linux的man shmat逐字:

返回值

返回错误(void*)-1,并设置errno以指示错误原因.

(POSIX使用略有不同的措辞来讲述相同的内容.)

是否有任何强制性规则或定义(标准?)(void *) -1可能不是有效地址?

c void-pointers

17
推荐指数
3
解决办法
3419
查看次数

为什么mmap()使用MAP_FAILED而不是NULL?

有谁知道为什么mmap()返回MAP_FAILED而不是NULL?在大多数系统上,似乎MAP_FAILED是(void*) - 1.为什么mmap()不使用NULL代替?我知道地址0x0在技术上是一个有效的内存页面,而(void*) - 1永远不会是一个有效的页面.但我的猜测是mmap()实际上永远不会实际返回页面0x0.例如,在Windows上,VirtualAlloc()在出错时返回NULL.

假设mmap()永远不会返回0x0是否安全?大概是对mmap()的成功调用应该将可用内存返回给调用者.地址0x0永远不可用,因此成功时永远不应返回.这种情况会让使用0x0作为失败的哨兵似乎是明智的,这就是为什么我首先对MAP_FAILED的存在感到困惑.

linux macos posix mmap ios

12
推荐指数
1
解决办法
4924
查看次数

malloc对内存对齐有哪些保证?

我遇到了以下代码:

int main()
{
    char *A=(char *)malloc(20);
    char *B=(char *)malloc(10);
    char *C=(char *)malloc(10);
    printf("\n%d",A);
    printf("\t%d",B);
    printf("\t%d\n",C);
    return 0;
}  
//output--   152928264     152928288    152928304
Run Code Online (Sandbox Code Playgroud)

我想知道如何完成分配和填充malloc().查看输出我可以看到起始地址是8的倍数.还有其他规则吗?

c malloc memory-management

11
推荐指数
3
解决办法
7477
查看次数

在64位指针中使用额外的16位

我读到64位机器实际上只使用48位地址(具体来说,我使用的是英特尔酷睿i7).

我希望额外的16位(位48-63)与地址无关,并将被忽略.但是当我尝试访问这样的地址时,我收到了一个信号EXC_BAD_ACCESS.

我的代码是:

int *p1 = &val;
int *p2 = (int *)((long)p1 | 1ll<<48);//set bit 48, which should be irrelevant
int v = *p2; //Here I receive a signal EXC_BAD_ACCESS.
Run Code Online (Sandbox Code Playgroud)

为什么会这样?有没有办法使用这16位?

这可用于构建更多缓存友好的链表.不是将8个字节用于下一个ptr,而是将8个字节用于密钥(由于对齐限制),可以将密钥嵌入到指针中.

64-bit pointers x86-64 memory-access

6
推荐指数
3
解决办法
4559
查看次数

如何在地址范围&gt; 4 GiB中分配

我正在尝试在X86_64 Linux上进行一些测试,并且我想知道如何使malloc()分配大于4 GiB范围内的返回地址

我是否必须使用单独的/自定义库覆盖malloc还是有其他简单的方法来做到这一点?

谢谢。

- - 编辑 - -

我感兴趣的是将地址当作uintptr_t)时的地址,它的虚拟地址还是物理地址都没有关系,因为我想要的就是该地址必须是大于4GiB 的

我在Linux x86_64上将gcc(4.2.1)与一起使用-m64

(希望我把问题弄清楚了)

c malloc

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