C释放阵列不起作用

时间:2015-04-14 01:45:29

标签: c arrays malloc free

这是我的代码。我正在创建一个数组,给元素赋予一些值,然后释放和打印。

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

int main()
{

    // malloc the array
    int* array = (int*) malloc(sizeof(int)*3);

    // give some values
    int i;
    for(i=0; i<3; i++) array[i] = 1 + i*i;

    // attempt to free 
    free(array+0);
    free(array+1);
    free(array+2);

    // print array elements
    for(i=0; i<3; i++) printf("%d , ", array[i]);
    return 0;
}

它只释放第一个和第二个元素(打印随机数),但第三个元素保留在那里。我该怎么做才能解决这个问题?如果我做错了什么(例如使用错误的免费),请指出这一点。感谢。

6 个答案:

答案 0 :(得分:5)

您无法逐个释放数组元素。

您必须将完全相同的指针传递给free给您的malloc

答案 1 :(得分:2)

free(array+0)已取消分配整个sizeof(int)*3数组,以下两个free()调用会导致未定义的行为(请参阅http://www.cplusplus.com/reference/cstdlib/free/)。

  

void free(void * ptr);

     

解除分配内存块

     

一块记忆   以前通过调用malloc,calloc或realloc分配的   取消分配,再次提供进一步分配。

     

如果ptr没有指向用上面分配的内存块   函数,它会导致未定义的行为。

     

如果ptr是空指针,则该函数不执行任何操作。

答案 2 :(得分:1)

C跟踪幕后分配的内存。如果你想释放一个你有malloced的块,你需要将指针传递给那块内存的开头。你应该使用:

free(array);

另外,你不应该施放malloc。

答案 3 :(得分:1)

另外,请注意,在free()ed之后访问内存区域会导致未定义的行为。 What happens to the data in memory deallocated by free()?

所以你不能通过打印存储在已经释放的内存区域中的值来结束某些事情。

答案 4 :(得分:0)

显示正确的代码:

#include <stdio.h>

int main()
{

    // malloc the array
    int* array = (int*) malloc(sizeof(int)*3);

    // give some values
    int i;
    for(i=0; i<3; i++) 
        array[i] = 1 + i*i;



     for(i=0; i<3; i++) //current values
        printf("%d , ", array[i]);
     putchar('\n');
    // attempt to free 
    free(array);

    // print array elements
    for(i=0; i<3; i++) //values after exposure functions free()
        printf("%d , ", array[i]);
    putchar('\n');


    return 0;

}

答案 5 :(得分:0)

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

int main()
{

    // malloc the array
    // <-- allocated 12 bytes of memory in the heap
    // <-- set a pointer-to-int 'array' to point to that memory
    // <-- in C, should NOT cast returned value from malloc (and family of functions)
    int* array = (int*) malloc(sizeof(int)*3);

    // give some values
    // <-- set allocated memory in the heap 
    //     to 0x0000001 0x00000002 0x00000005
    int i;
    for(i=0; i<3; i++) array[i] = 1 + i*i;

    // attempt to free
    // <-- unallocate all 12 bytes
    free(array+0);

    // <-- corrupt the heap, this not an address pointer
    // <-- returned by malloc (or family of functions)
    free(array+1);

    // <-- corrupt the heap some more, this is not an address pointer
    // <-- returned by malloc (or family of functions)
    free(array+2);

    // print array elements
    // <-- trying to print using array as a base address ptr,
    // <-- when array no longer points to any allocated memory
    // <-- array still points into the heap, but the 
    // <-- 12 bytes are already returned to the OS
    // <-- so the program should not be accessing those 12 bytes
    for(i=0; i<3; i++) printf("%d , ", array[i]);
    return 0;
} // end function: main