在c中为指向字符串指定指针

时间:2015-05-14 03:33:40

标签: c pointers

redirect.php

有人可以解释为什么这个功能会导致内存泄漏吗?

3 个答案:

答案 0 :(得分:4)

您首先使用指向内存中某个位置的指针初始化a。然后,将a重新分配给另一个指向字符串asdf占用位置的指针,这样就丢失了指向已分配内存的第一个指针。你永远不能释放它们,因为你最初忘记了malloc分配的5字节内存。

你在这里泄漏了5个字节的内存。

如果您要将asdf复制到a指向的内存,可以使用strcpy

strcpy(a, "asdf"); 

通过这种方式,您需要在代码中的某处调用free以避免泄漏。

答案 1 :(得分:3)

简短回答:

char * a = malloc(sizeof(char)*5);

你从堆中分配了内存,a在堆中有一个地址(比如0x1234EEEE)指向动态内存。完成后需要释放此分配,否则会发生内存泄漏。

然后

a = "asdf";

现在你已经指定了一个as指向存储字符串"asdf"的静态编译时内存位置(比如0x0BADBEEF,它不在动态堆中)。你不再知道你从上面的malloc调用中分配内存的地方(它在0x1234EEEE,但现在你没有引用它),因此你永远不会释放()它......这是一个泄漏;

答案 2 :(得分:0)

" char * a;"

这里是一个指针,它可以指向任何东西。

" a =(char *)0x0000" 应该是有效的,但不合逻辑;

"长l = 12345L; a =(char *)& l;" 这也应该是合法的,但不合乎逻辑

" ASDF"在您的示例中是一个静态字符串,它存储在编译时分配的内存中。你可以["返回(" asdf");"从您的函数中,理解它是在编译时定义的静态分配的内存空间。在不理解逻辑内存布局的情况下使用指针会产生一些你可能很快就会学到的结果;〜)。