我们昨天在课堂上看到了这个程序,我对它的输出有疑问。
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
的某些错误吗?
答案 0 :(得分:5)
在free(x);
之后,x
指向的值不再有效。内存可以再用于其他目的,同时内存分配库可以根据需要使用存储。
所以,是的,这是导致不确定行为的错误。
答案 1 :(得分:3)
真正的问题是,为什么您甚至期望它能起作用?释放x,然后返回一个无意义的释放指针。
正在发生的事情如下:
在函数中分配5个空格,x指向第一个 一个人的地址。
您在这些空格中输入0、1、2、3、4。
您释放了x,因此不再保留所有5个空格。
您退出该函数,这样做是下一个2个可用内存空间 使用,恰好是您写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;
}