我想知道是否可以检查传递给函数的指针是否由malloc/calloc/realloc分配?
int main(){
struct something o;
struct something *a;
a = malloc(sizeof(struct something));
freeSome(&o);/*This would normally throw an (corruption?) error*/
freeSome(a);/*This is fine*/
}
void freeSome(struct something * t){
if (/*expression here*/){
free(t);
}
}
Run Code Online (Sandbox Code Playgroud)
我明白,通常你会检查是否t == NULL,但我只是想知道是否有可能看到是否已为给定指针分配内存.
我在家庭作业上有这个问题(不用担心,已经完成):
[使用您最喜欢的命令式语言,给出每个...的示例]编译器既无法捕获也无法轻松生成要捕获的代码的错误(这应该违反语言定义,而不仅仅是程序错误)
来自"编程语言语用学"(第3版)Michael L. Scott
我的回答,称main从main通过传递相同的参数(在C和Java),灵感来自此.但我个人觉得这只是一个语义错误.
对我来说,这个问题是在询问如何产生一个既不是语法也不是语义的错误,坦率地说,我无法想到它不会陷入其中的情况.
是否容易被利用的代码,如缓冲区溢出(以及我从未听说过的其他利用)?某种坑从语言结构中掉落(IDK,但懒惰的评估/弱类型检查)?我想在Java/C++/C中使用一个简单的例子,但欢迎其他例子.
我已经看到了指针算法的解释(例如指针算术).但我想知道是否存在真正的区别:
鉴于:
int* arr = (int*) malloc(sizeof(int) * 3);
Run Code Online (Sandbox Code Playgroud)
请问:
&(arr[1])
Run Code Online (Sandbox Code Playgroud)
和:
arr + 1
Run Code Online (Sandbox Code Playgroud)
除了语法之外,在任何方面都有所不同.技术上要么更高效吗?是否有某些上下文在第一个上面使用指针成瘾?我在没有循环或条件的情况下看到了从打印1到1000的一个示例.提前致谢.