如果指定的指针是"有效的",有没有办法确定(当然是以编程方式)?检查NULL很简单,但像0x00001234这样的东西呢?当试图取消引用这种指针时,会发生异常/崩溃.
首选跨平台方法,但平台特定(适用于Windows和Linux)也可以.
更新澄清: 问题不在于陈旧/释放/未初始化的指针; 相反,我正在实现一个从调用者获取指针的API(比如指向字符串的指针,文件句柄等).调用者可以(有意或无意地)发送无效值作为指针.如何防止崩溃?
我注意到有些人使用以下表示法来声明指针变量.
(a) char* p;
Run Code Online (Sandbox Code Playgroud)
代替
(b) char *p;
Run Code Online (Sandbox Code Playgroud)
我用(b).符号(a)背后的理性是什么?符号(b)对我来说更有意义,因为字符指针本身不是一种类型.相反,类型是字符,变量可以是指向字符的指针.
char* c;
Run Code Online (Sandbox Code Playgroud)
这看起来像char*类型,变量c是该类型.但实际上类型是char和*c(c指向的内存位置)是该类型(char).如果一次声明多个变量,这种区别就变得很明显了.
char* c, *d;
Run Code Online (Sandbox Code Playgroud)
这看起来很奇怪.c和d都是指向字符的同一种指针.因为下一个看起来更自然.
char *c, *d;
Run Code Online (Sandbox Code Playgroud)
谢谢.
背景:我试图围绕指针,我们几周前在学校看到它们,今天练习时我遇到了傻瓜?问题,对你来说可能非常简单,但我几乎没有编程经验.
我在SO中看到了很多关于删除指针的问题,但它们似乎都与删除一个类有关,而不是一个"简单"指针(或任何正确的术语),这里是我试图的代码跑:
#include <iostream>;
using namespace std;
int main() {
int myVar,
*myPointer;
myVar = 8;
myPointer = &myVar;
cout << "delete-ing pointers " << endl;
cout << "Memory address: " << myPointer << endl;
// Seems I can't *just* delete it, as it triggers an error
delete myPointer;
cout << "myPointer: " << myPointer << endl;
// Error: a.out(14399) malloc: *** error for object 0x7fff61e537f4:
// pointer being freed was not allocated
// *** set a breakpoint in malloc_error_break …Run Code Online (Sandbox Code Playgroud) #include<stdio.h>
#include<string.h>
int main()
{
char * p = "abc";
char * p1 = "abc";
printf("%d %d", p, p1);
}
Run Code Online (Sandbox Code Playgroud)
当我打印两个指针的值时,它打印相同的地址.为什么?
(参考这个问题和答案.)
在C++ 17标准之前,[basic.compound]/3中包含以下句子:
如果类型T的对象位于地址A,则类型为cv T*的指针(其值为地址A)被称为指向该对象,而不管该值是如何获得的.
但是自从C++ 17以来,这句话已被删除.
例如,我相信这句话使这个示例代码定义,并且从C++ 17开始这是未定义的行为:
alignas(int) unsigned char buffer[2*sizeof(int)];
auto p1=new(buffer) int{};
auto p2=new(p1+1) int{};
*(p1+1)=10;
Run Code Online (Sandbox Code Playgroud)
在C++ 17之前,p1+1保持地址*p2并具有正确的类型,因此*(p1+1)是指向*p2.在C++中,17 p1+1是一个指向前端的指针,所以它不是指向对象的指针,我相信它不是可以解除引用的.
对标准权的这种修改的解释是否还有其他规则来补偿所引用的句子的删除?
根据我的理解,const修饰符应该从右到左阅读.从那以后,我明白了:
const char*
Run Code Online (Sandbox Code Playgroud)
是一个指针,其char元素不能被修改,但指针本身可以,和
char const*
Run Code Online (Sandbox Code Playgroud)
是一个指向mutable字符的常量指针.
但是我得到以下代码的以下错误:
const char* x = new char[20];
x = new char[30]; //this works, as expected
x[0] = 'a'; //gives an error as expected
char const* y = new char[20];
y = new char[20]; //this works, although the pointer should be const (right?)
y[0] = 'a'; //this doesn't although I expect it to work
Run Code Online (Sandbox Code Playgroud)
那么是哪一个呢?我的理解还是我的编译器(VS 2005)错了?
我们假设,
int *p;
int a = 100;
p = &a;
Run Code Online (Sandbox Code Playgroud)
以下代码将实际执行什么以及如何执行?
p++;
++p;
++*p;
++(*p);
++*(p);
*p++;
(*p)++;
*(p)++;
*++p;
*(++p);
Run Code Online (Sandbox Code Playgroud)
我知道,这在编码方面有点混乱,但我想知道当我们这样编码时会发生什么.
注意:让我们假设它的地址a=5120300,它存储在p地址为的指针中3560200.现在,p & a执行每个语句后的价值是多少?
错误的形式:
int &z = 12;
Run Code Online (Sandbox Code Playgroud)
正确形式:
int y;
int &r = y;
Run Code Online (Sandbox Code Playgroud)
问题:
为什么第一个代码错了?标题中错误的"含义 "是什么?
我有一个带*int64字段的结构类型.
type SomeType struct {
SomeField *int64
}
Run Code Online (Sandbox Code Playgroud)
在我的代码中的某个时刻,我想声明一个这样的文字(比如,当我知道所述值应为0,或者指向0时,你知道我的意思)
instance := SomeType{
SomeField: &0,
}
Run Code Online (Sandbox Code Playgroud)
...除了这不起作用
./main.go:xx: cannot use &0 (type *int) as type *int64 in field value
Run Code Online (Sandbox Code Playgroud)
所以我试试这个
instance := SomeType{
SomeField: &int64(0),
}
Run Code Online (Sandbox Code Playgroud)
......但这也行不通
./main.go:xx: cannot take the address of int64(0)
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?我能想出的唯一解决方案是使用占位符变量
var placeholder int64
placeholder = 0
instance := SomeType{
SomeField: &placeholder,
}
Run Code Online (Sandbox Code Playgroud)
注意:当它是*int而不是a时,编辑:不,不.为此表示歉意.&0语法工作正常*int64.
编辑:
显然,我的问题含糊不清.我正在寻找一种方法来说明一个*int64.这可以在构造函数中使用,或者用于表示文字结构值,或者甚至作为其他函数的参数.但帮助函数或使用不同的类型不是我正在寻找的解决方案.
考虑以下代码:
public class Program
{
private static void Main(string[] args)
{
var person1 = new Person { Name = "Test" };
Console.WriteLine(person1.Name);
Person person2 = person1;
person2.Name = "Shahrooz";
Console.WriteLine(person1.Name); //Output: Shahrooz
person2 = null;
Console.WriteLine(person1.Name); //Output: Shahrooz
}
}
public class Person
{
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
很显然,当分配person1到person2与Name物业person2发生变化,Name中person1也将改变.person1并person2有相同的参考.
为什么何时person2 = null,person1变量也不会为空?