malloc和指针问题

malloc和指针问题,c,pointers,malloc,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);

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

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;
}
但是,前两个元素不应该分别为0和1吗?这里打印的值对我来说就像是内存地址,对吗?另外,这是由于一些错误导致
未定义的行为

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

因此,是的,这是一个导致未定义行为的错误。

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


所以,是的,这是一个导致未定义行为的错误。

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

发生的情况如下:

  • 在函数内部分配5个空格,x指向第一个空格 住址

  • 在这些空格中写0,1,2,3,4

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

  • 退出函数后,接下来的2个可用内存空间 使用,正好是您编写0和1的地方

  • 打印包含在已创建的5个内存区域中的值 已释放,您在其中写入0和1的内容恰好已被释放 重新用于其他用途;因此出现了奇怪的数字
一般来说,不要试图读取我释放的内存区域;更糟糕的是,不要试图在那里写作

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

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

更正代码:

#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;
}
#包括
int*创建_数组(int元素){
int i,*x=malloc(elements*sizeof(int));
对于(i=0;i对于(j=0;j来说,真正的问题是,为什么你甚至希望它能工作?释放x,然后返回一个释放的指针,这是胡说八道

发生的情况如下:

  • 在函数内部分配5个空格,x指向第一个空格 住址

  • 在这些空格中写0,1,2,3,4

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

  • 退出函数后,接下来的2个可用内存空间 使用,正好是您编写0和1的地方

  • 打印包含在已创建的5个内存区域中的值 已释放,您在其中写入0和1的内容恰好已被释放 用于其他用途;因此出现了奇怪的数字
一般来说,不要尝试读取我释放的内存区域;更糟糕的是,不要尝试在那里写入

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

此外,如果函数之间没有任何内容,则不需要在单独的行中声明该函数;此外,也不必将malloc返回的内容强制转换为该类型;它是一个空*默认情况下可以保存您向它抛出的任何内容。重要的是基变量类型

更正代码:

#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;
}
#包括
int*创建_数组(int元素){
int i,*x=malloc(elements*sizeof(int));
对于(i=0;i对于(j=0;当您调用free
free(x)时
,指向
x
的指针变成了一个
悬空指针
,它基本上是指向您不再拥有的内存的指针。如果另一个程序被授予访问该释放内存区域的权限,则该程序完全有可能因
segfault
而崩溃。谢谢你们提供的信息,现在一切都有意义了。当您免费呼叫<代码>免费(x)
,指向
x
的指针变成了一个
悬空指针
,它基本上是指向您不再拥有的内存的指针。如果另一个程序被授予访问该释放内存区域的权限,则该程序完全有可能因
segfault
而崩溃。谢谢你们提供的信息,现在一切都有意义了。谢谢u、 我明白为什么那不起作用了。一开始就没有意义!谢谢,我明白为什么那不起作用了。一开始就没有意义!