动态分配内存然后释放有问题?

1.出问题的行 *p++ = i;

2.直接看代码

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

int main()
{
    int *p;
    p = (int *)malloc(100 * sizeof(int));

    if(p==NULL){
        exit(1);
    }

    for(int i=0; i<25; i++) {
         p[i] = i;                  //这里如果用指针赋值就出错   *p++ = i;
        
    }
    printf("p[0] is=%d\n", *p);
    printf("p[24] is=%d\n", *p+24);
    
    free(p);
    
    return 0;
}

2.错误描述
munmap_chunk(): invalid pointer:

阅读 4.1k
2 个回答

参见此处free函数文档。即如果free(ptr)函数中参数ptr不是之前用callocmalloc, 或realloc分配内存返回的地址,或者ptr是已释放的空间,就是一个未定义的行为,一般会导致内存错误。而*p++ = i;显然对p进行了修改,即free(p);时的p值不是malloc时的值,所以会导致内存错误。

当修改分配的指针时,应该先做好备份,以便在最后能正确释放。

此外printf("p[24] is=%d\n", *p+24);p[24]应该是*(p+24),注意运算符的优先级,*p+24等价于p[0] + 24

新手上路,请多包涵

free函数释放的指针必须为malloc函数成功分配的内存空间的地址,如果使用指针 *p++ = i, 会改变指针p指向的地址, 导致free函数报错。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进