相关疑难解决方法(0)

删除指针后将指针NULL化是一种好习惯吗?

我首先要说的是,使用智能指针,你永远不必担心这一点.

以下代码有什么问题?

Foo * p = new Foo;
// (use p)
delete p;
p = NULL;
Run Code Online (Sandbox Code Playgroud)

这是由另一个问题的回答和评论引发的.Neil Butterworth的一条评论产生了一些赞成:

在删除后将指针设置为NULL不是C++中的通用优良做法.有时候它是一件好事,有时它是毫无意义的,可以隐藏错误.

有很多情况下它无济于事.但根据我的经验,它不会伤害.有人开导我.

c++ null pointers dynamic-allocation

139
推荐指数
6
解决办法
8万
查看次数

当空指针不是所有位为零时,如何正确编写C/C++代码

正如comp.lang.c常见问题所述,有一些架构,其中空指针不是所有位零.所以问题是实际检查以下结构:

void* p = get_some_pointer();
if (!p)
    return;
Run Code Online (Sandbox Code Playgroud)

我是否p与机器相关的空指针进行比较或者我是否p与算术零进行比较?

我应该写

void* p = get_some_pointer();
if (NULL == p)
    return;
Run Code Online (Sandbox Code Playgroud)

相反,为这样的架构做好准备还是仅仅是我的偏执?

c c++ computer-architecture

69
推荐指数
4
解决办法
4800
查看次数

我可以访问地址零吗?

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

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

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

c c++ memory pointers

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

这些空指针,还是地址为0的指针?

如果我写

int zero = 0;

void *p1 = (void *)0;
void *p2 = (void *)(int)0;
void *p3 = (void *)(0 /*no-op, but does it affect the next zero?*/, 0);

void *p4 = (void *)zero;    // For reference, this is a pointer to address zero
void *p5 = 0;               // For reference, this is a null pointer
void *p6 = NULL;            // For reference, this is a null pointer
void *p7 = nullptr;         // For reference, this is a null pointer …
Run Code Online (Sandbox Code Playgroud)

c c++ null nullptr language-lawyer

18
推荐指数
3
解决办法
888
查看次数

为什么NULL/0是对象的非法内存位置?

我理解NULLC/C++中常量的用途,我理解它需要在内部以某种方式表示.

我的问题是:对于C/C++中的对象,0地址是否是无效的内存位置有一些根本原因吗?或者我们理论上是因为这次预订而"浪费"一个字节的内存?

c c++ null memory-management

16
推荐指数
6
解决办法
7464
查看次数

指向特定固定地址的指针

如何为指针分配特定的内存地址?

微控制器中的特殊功能寄存器如AVR m128具有固定地址,AVR GCC在io.h头文件中定义了SFR,但我想自己处理它.

c pointers

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

理解求和逻辑

这是在不使用运算符的情况下执行加法的求和逻辑,+如下所示,

int add(int a, int b) {
   const char *c=0;
   return &(&c[a])[b];
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以让我理解如何return声明如何添加a&b.

c

7
推荐指数
2
解决办法
483
查看次数

C中的内存起始位置

我正在研究给定进程的内存布局.我注意到每个进程的起始内存位置不是0.在这个网站上,TEXT从0x08048000开始.一个原因可以是使用NULL指针区分地址.我只是想知道是否还有其他好的理由?谢谢.

c memory memory-layout

7
推荐指数
1
解决办法
1518
查看次数

什么是C++中的'\ 0'?

我正在尝试将一个巨大的项目从C++翻译成Delphi,我正在完成翻译.我留下的一件事是'\ 0'怪物.

if (*asmcmd=='\0' || *asmcmd==';')
Run Code Online (Sandbox Code Playgroud)

其中asmcmd是char*.

我知道\ 0标志着C++中数组类型的结束,但我需要知道它是一个字节.是0吗?

换句话说,下面的代码是否等同于C++行?

if(asmcmd^=0) or (asmcmd^=';') then ...
Run Code Online (Sandbox Code Playgroud)

其中asmcmd是PAnsiChar.

你不需要知道Delphi来回答我的问题,但是告诉我\ 0为字节.那也行.:)

c++ delphi translation operators

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

写入[ds:0x0]后添加ud2有什么意义?

我正在尝试使用 GCC,试图说服它假设代码的某些部分无法访问,以便趁机进行优化。我的一项实验给了我一些奇怪的代码。这是来源:

#include <iostream>

#define UNREACHABLE {char* null=0; *null=0; return {};}

double test(double x)
{
    if(x==-1) return -1;
    else if(x==1) return 1;
    UNREACHABLE;
}

int main()
{
    std::cout << "Enter a number. Only +/- 1 is supported, otherwise I dunno what'll happen: ";
    double x;
    std::cin >> x;
    std::cout << "Here's what I got: " << test(x) << "\n";
}
Run Code Online (Sandbox Code Playgroud)

我是这样编译的:

g++ -std=c++11 test.cpp -O3 -march=native -S -masm=intel -Wall -Wextra
Run Code Online (Sandbox Code Playgroud)

函数的代码test如下所示:

_Z4testd:
.LFB1397:
        .cfi_startproc
        fld     QWORD PTR [esp+4] …
Run Code Online (Sandbox Code Playgroud)

c++ x86 gcc

5
推荐指数
1
解决办法
1189
查看次数