Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
free()会在C中的第二个数组指针上工作吗?_C_Malloc - Fatal编程技术网

free()会在C中的第二个数组指针上工作吗?

free()会在C中的第二个数组指针上工作吗?,c,malloc,C,Malloc,假设我有一些如下设置的代码: #include <stdlib.h> #include <stdio.h> int main() { char* primary = malloc(10); // main pointer to heap memory char* secondary = primary; // an alias for the main pointer free(secondary); } freesecondar

假设我有一些如下设置的代码:

#include <stdlib.h>
#include <stdio.h>

int main() {
    char* primary = malloc(10);    // main pointer to heap memory
    char* secondary = primary;     // an alias for the main pointer
    free(secondary);
}
freesecondary是否也会释放分配给primary的内存

是的,free将在任何指针上工作,该指针包含由malloc、calloc或realloc返回的地址。尽管这样做有点危险,因为你可能会两次释放指针。只有两个中的一个将被传递给自由,在你这样做之后,你不能用他们中的任何一个再做一次

通常的做法是在将指针传递到free之后将其设置为NULL,以避免指针悬空,从而避免多次意外释放指针,在您描述的场景中,您可能只将其中一个指针设置为NULL


简言之,如果您这样做,主指针将成为另一个悬挂指针,其危险性是只有次指针的两倍。

指针值相同。当您将primary分配给secondary时,这两个指针指向malloc分配的相同内存地址。你可以释放其中一个,但不能同时释放两个

这在您实际上没有调用malloc或释放自己的情况下特别有用

考虑POSIX函数strdup,它将字符串复制到新分配的内存中。本质上是为您调用malloc或类似的函数

char[] strarr = "I am a string.";
char* mystr = strdup(strarr);

/* do some stuff */

free(mystr)
strdup可能将其内存分配函数的结果存储在一个变量中,而mystr几乎肯定不是该函数体中的名称。该变量被返回并重新分配给mystr,然后您必须释放它

那么,为什么我们不能使用sizeof或其他内置函数来查找指针数组的大小呢

不要混淆语言和库。sizeof不是函数,malloc不是内置的

在C语言中,sizeof是一个运算符,而不是一个函数。请注意,您不需要声明它。你可以这样说:

size_t size = sizeof(void*);
因为您并没有将变量传递给sizeof,而是传递一个表达式。表达式有一个类型,每个类型都有一个大小

当你说

char greeting[] = "hello";
size_t len = sizeof greeting;
len是6,因为问候语的类型为char[6]。因为sizeof是一个运算符,所以我们可以省去括号。括号通常与它一起使用,但只是为了避免运算符优先级问题

C标准库定义了malloc和free,但是我们不能称之为函数的size_来返回分配块的大小。实现可以提供这样的功能。与维护堆相比,它在技术上是微不足道的


为什么通常不提供尺寸_?我会说,因为它不太需要。虽然像memset这样的函数可以对整个内存块进行操作,但它们对部分内存块也很有用。块中的字节数往往比它包含结构或甚至int的更高级元素的数量少。我们可以注意到,十年后设计的C++ STL算法也不在整个集合上操作,而是采用开始和停止参数。 此外,对空指针多次调用free是无害的,但对已释放的非空指针调用free可能会导致严重问题。传递给malloc的参数是指针值,而不是指针对象。初级和次级具有相同的值,因此传递给malloc的任何一个都具有相同的效果。新的最后一段提出了一个新问题。你原来的问题已经回答了。可以随意发布一个新问题,但首先要检查重复的问题;我肯定以前有人问过。谢谢,删除了额外的问题。你不释放指针,也不释放变量-你释放了malloc分配的内存块。很明显,primary和secondary是两个不同的指针对象,但它们拥有相同的指针值,传递给free的就是这个值。@EdHeal:我是指free,不是malloc。感谢您在5分钟的编辑窗口中指出我的错误@KeithThompson是的,当我说它们是相同的指针时,听起来确实有点像是同一个对象,但实际上它们是分配在两个不同位置的两个不同对象,但内存具有相同的值。对。问题是,非限定词指针可以引用指针对象或指针值。在这种情况下,区别很重要。如果你想说得更精确,就把单词pointer当作形容词,而不是名词。一个小小的诡辩。strdup是否在内部使用mystr这个名称一点也不重要。即使是这样,它也是一个独立的对象,而不是示例代码中的mystr。