malloc和指针问题

时间:2018-11-17 22:41:20

标签: c pointers malloc

我们昨天在课堂上看到了这个程序,我对它的输出有疑问。

malloc.c:

#include <stdlib.h>

int *create_array(int);

int *create_array(int elements) {
    int i,*x = (int *) malloc(elements*sizeof(int));

    for(i=0;i < elements;i++) {
        x[i] = i;
    }
    free(x);
    return x;
} 

int main(void) {
    int j, *arr;
    arr = create_array(5);
    for(j=0;j<5;j++) {
        printf("%d\n",arr[j]);
    }
    return 0;
}

问题:

运行程序时,我将其作为输出:

1627793032
1627793104
2
3
4

但是,前两个元素不应该分别为0和1吗?在这里打印的值对我来说就像是内存地址,对吗?另外,这是由于导致undefined behavior的某些错误吗?

2 个答案:

答案 0 :(得分:5)

free(x);之后,x指向的值不再有效。内存可以再用于其他目的,同时内存分配库可以根据需要使用存储。

所以,是的,这是导致不确定行为的错误。

答案 1 :(得分:3)

真正的问题是,为什么您甚至期望它能起作用?释放x,然后返回一个无意义的释放指针。

正在发生的事情如下:

  • 在函数中分配5个空格,x指向第一个 一个人的地址。

  • 您在这些空格中输入0、1、2、3、4。

  • 您释放了x,因此不再保留所有5个空格。

  • 您退出该函数,这样做是下一个2个可用内存空间 使用,恰好是您写0和1的地方。

  • 打印已经包含在5个存储区中的值 已释放,您写了0和1的位置恰好在 再用于其他用途;因此怪异的数字。

通常,请勿尝试读取我释放的内存区域;更糟糕的是,不要尝试在那儿写东西。

访问未分配的内存会导致未定义的行为。

此外,如果函数之间没有任何内容,则无需在单独的行中声明该函数;另外,您不必将malloc返回的内容强制转换为该类型;这是一个void *,默认情况下可以容纳您向其扔的任何东西。重要的是您的基本变量类型。 See here

更正的代码:

#include <stdlib.h>

int *create_array(int elements) {
    int i,*x = malloc(elements*sizeof(int));

    for(i=0;i < elements;i++) {
        x[i] = i;
    }
    return x;
} 

int main(void) {
    int j, *arr;
    arr = create_array(5);
    for(j=0;j<5;j++) {
        printf("%d\n",arr[j]);
    }
    free(arr);
    return 0;
}