让我们假设这段代码:
int i,j=0;
char* block = (char*) (0x9000);
char table[4]= {0x01,0x02,0x03,0x04};
for (i=0; i< 45567; i++) {
*(block +i)= table[j];
j++;
if (j==4)
j=0;
}
我想问一下:
block
的内存是在堆栈中还是在堆中分配的?free(block)
吗?答案 0 :(得分:11)
你实际上并没有在堆栈上和堆上分配任何内存。你只是将变量指向一个地址,然后假装那里的内存属于你。
这在C或C ++中都不合法,并且通常不起作用。而“不工作”在这里真的意味着什么。由于代码是非法的,指针是否可以free
d的问题是没有意义的。
(在非常具体的设置中,如果编译器和硬件支持它,则用于写入特定的硬件地址。但这不是这种情况。)
答案 1 :(得分:3)
是在堆栈中还是在堆中分配的块内存?
都不是。它根本没有分配:你为指针分配了一个任意数字,所以任何从block
读取或写入的尝试都是未定义的行为。
我可以在此代码末尾使用免费(块)吗?
这也是未定义的行为。您被允许传递到free
的指针必须来自malloc
,calloc
或realloc
。
注意: Undefined Behavior是当程序执行标准不允许的操作时发生的正式名称,编译器无法捕获。在许多情况下,未定义的行为会导致崩溃,但不幸的是,在某些情况下,您的程序似乎有效。
答案 2 :(得分:2)
你不需要释放任何你没有要求获得空间的东西, 你没有realloc malloc或calloc声明的所有内容都不需要空闲,它们存储在静态存储或堆栈中。
还有strdup
以及其他一些您需要免费的功能,但简单声明不需要free
答案 3 :(得分:0)
您应该从不对free
,malloc
或{{1}之一未返回的指针值调用calloc
}。
如果realloc
是您平台上有效的可写地址,那么知道吗?
答案 4 :(得分:0)
数组table
可能在堆栈中。希望指针block
在一些其他未被占用的内存中,也许它被分配,并且0x9000是一些特殊地址,没有足够的代码来确定上下文。根据架构,可能允许或不允许盲目地写入任意地址。
所以回答你的问题:
你不应该没有malloc / calloc / realloc,结果是未定义的;例外确实存在,例如,如果系统在您使用之前分配了空间,但通常如果系统分配内存,它将自行释放
此代码可能会发生各种问题,但取决于架构;我写的是完全合法的平台,其他人会抛出各种异常;可能是它从0x9000开始填充45567个字节,重复序列为1到4,否则可能会导致机器崩溃; C很乐意让你自己拍脚
答案 5 :(得分:0)
你所做的是非常危险的。你不应该选择一个随机地址并将其分配给指向将数据复制到内存的指针。就像在地球上的随机位置倾倒核废料一样。你应该使用malloc或new安全地分配内存。