我明白有一个星号*是指针,有两个**是什么意思?
我从文档中偶然发现了这个:
- (NSAppleEventDescriptor *)executeAndReturnError:(NSDictionary **)errorInfo
Run Code Online (Sandbox Code Playgroud) 我想分配一个矩阵.
这是唯一的选择:
int** mat = (int**)malloc(rows * sizeof(int*))
for (int index=0;index<row;++index)
{
mat[index] = (int*)malloc(col * sizeof(int));
}
Run Code Online (Sandbox Code Playgroud) 我已经阅读了这个问题,我仍然不知道是否有可能继续指向方法Java中的数组,如果任何人知道,如果这是可能的,或者不是这将是一个真正的帮助.我正试图找到一个优雅的解决方案,保持一个字符串列表和相关的功能,而不会写出数百个'if'的混乱.
干杯
看,
typedef struct jig
{
int *a;
int *b;
}temp;
Run Code Online (Sandbox Code Playgroud)
现在第1阶段:
temp *b;
b= (temp*)malloc(sizeof(temp));
if(b->a != NULL)
printf("a is not null\n");
else
printf("a is null\n");
if(b->b != NULL)
printf("b is not null\n");
else
printf("b is null\n");
Run Code Online (Sandbox Code Playgroud)
输出是:
a is null
b is null
Run Code Online (Sandbox Code Playgroud)
现在第2阶段:
temp b;
if(b.a != NULL)
printf("a is not null\n");
else
printf("a is null\n");
if(b.b != NULL)
printf("b is not null\n");
else
printf("b is null\n");
Run Code Online (Sandbox Code Playgroud)
输出是:
a is not null
b is not null …Run Code Online (Sandbox Code Playgroud) 我有一个功能:
myFunction (MyProc callback, void * ref)
Run Code Online (Sandbox Code Playgroud)
从Objective-C类中调用此函数.该函数传递一个指向回调(类中的函数)和引用的指针.引用是必要的,因为回调是静态调用的,因此没有上下文.ref可用于为回调提供上下文.
我希望能够传递Objective-C类作为参考.所以问题是:
如何将NSObject转换为void*以及如何将void*转换为NSObject.
提前致谢.
在我看到的示例中,参数通过以下方式通过引用传递:
void AddOne(int &y)
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我看到以下语法:
void AddOne(int& y)
Run Code Online (Sandbox Code Playgroud)
我想知道它是否相同或第二种情况与第一种情况有所不同.
本网站上有很多关于在使用后释放指针的问题,并且进一步将它们设置为NULL.争论很激烈,主题看似平分.例如:这个问题.一般来说,我对释放指针很困惑.
想象一下,你有一个指向一些内存空间的指针.使用空格后,释放指针但不要将其设置为NULL.稍后,你有另一个指针调用malloc(),或者一些模拟,并且它被分配了内存,包括先前释放的内存(原始指针仍然指向).如果这个新指针写入此内存块,会发生什么?直觉上什么都不会发生,但前面提供的链接中的OP写道它会使程序崩溃.
所以我的问题是:
给定一个释放指针,是什么阻止您将指针重新分配给新的内存位置?为什么重用已释放的指针是"坏"的做法?如果调用free(ptr)只将此内存返回给操作系统,为什么不能将指针重新分配给其他内存位置并重新使用?
char *ptr = malloc(sizeof(*ptr)); //first allocation
free(ptr); //release memory
ptr = NULL;
ptr = malloc(sizeof(*ptr)); //reallocate
Run Code Online (Sandbox Code Playgroud)为什么要写入以前释放的内存块,仍然有原始指针,导致程序崩溃? - 请参阅上面链接的问题的第一篇文章的第一段(如果我误解了本段的意图,请解释,因为不明确是否再次使用该指针来写入内存或创建新指针.)
有人声称
编译器可以自由地将指针变量重用于其他目的之后
realloc被释放,所以你不能保证它具有与之前相同的价值
即
void *p = malloc(42);
uintptr_t address = (uintptr_t)p;
free(p);
// [...] stuff unrelated to p or address
assert((uintptr_t)p == address);
Run Code Online (Sandbox Code Playgroud)
可能会失败.
C11附件J.2读
使用指向通过调用free或realloc函数释放的空间的指针的值(7.22.3)[ 未定义 ]
但附件当然不是规范性的.
附件L.3(规范性的,但可选的)告诉我们,如果
使用指向通过调用free或realloc函数解除分配的空间的指针的值(7.22.3).
结果被允许是关键的未定义行为.
这证实了这一说法,但我希望从标准本身而不是附件中看到适当的引用.
在下面的代码片段中,尝试将nil接口转换为某个东西的指针失败,并出现以下错误: interface conversion: interface is nil, not *main.Node
type Nexter interface {
Next() Nexter
}
type Node struct {
next Nexter
}
func (n *Node) Next() Nexter {...}
func main() {
var p Nexter
var n *Node
fmt.Println(n == nil) // will print true
n = p.(*Node) // will fail
}
Run Code Online (Sandbox Code Playgroud)
点击此处播放链接:https://play.golang.org/p/2cgyfUStCI
为什么这会完全失败?这完全有可能
n = (*Node)(nil)
Run Code Online (Sandbox Code Playgroud)
,所以我想知道如何从nil接口开始实现类似的效果.
C++ 17标准似乎说如果指针指向数组元素,则只能将一个整数添加到指针中,或者,作为特殊异常,指针是一元运算符的结果&:
8.5.6 [expr.add]描述对指针的添加:
当向指针添加或从指针中减去具有整数类型的表达式时,结果具有指针操作数的类型.如果表达式P指向具有n个元素的数组对象 x的元素x [i] ,则表达式P + J和J + P(其中J具有值j)指向(可能是假设的)元素x [i + j]如果0≤i+j≤n; 否则,行为未定义.
该引言包括一个非规范的脚注:
为此目的,不是数组元素的对象被认为属于单元素数组; 见8.5.2.1
引用8.5.2.1 [expr.unary.op]讨论一元运算&符:
一元&运算符的结果是指向其操作数的指针...出于指针运算(8.5.6)和比较(8.5.9,8.5.10)的目的,一个不是数据元素的对象,其地址被采用以这种方式被认为属于具有T类型的一个元素的数组.
非规范性脚注似乎有些误导,因为它引用的部分描述了一元运算符结果的特定行为&.似乎没有任何东西允许其他指针(例如来自非数组new)被认为是单元素数组.
这似乎表明:
void f(int a) {
int* z = (new int) + 1; // undefined behavior
int* w = &a + 1; // ok
}
Run Code Online (Sandbox Code Playgroud)
这是对C++ 17所做更改的疏忽吗?我错过了什么吗?是否有理由认为"单元素数组规则"仅针对一元运算符提供&?
注意:如标题中所述,此问题特定于C++ 17.C标准和C++标准的早期版本包含不再存在的明确的规范性语言.像这样的老问题模糊不清楚.