c - 动态数组和函数化 malloc

标签 c arrays

<分区>

我尝试函数式地malloc一个数组,这个函数还可以检查内存是否足够。

第一个代码块不能工作。 当它执行“*pi = 5”时,编译器会显示此错误消息“Thread 1: EXC_BAD_ACCESS(code=1, address=0x0)”

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

 void malloc_and_check(int *var)
 {
     if(!(var = (int*)malloc(sizeof(int))))
     {
        fprintf(stderr, "Insufficient Memory\n");
        exit(EXIT_FAILURE);
     } 
 }

 int main(int argc, const char * argv[]) 
 {
    int *pi;
    malloc_and_check(pi);
    *pi = 5;
    printf("%d", *pi);
    free(pi);
 }

但是下面的代码可以正常运行。

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

    int main(int argc, const char * argv[])
    {
        int *pi;

        if(!(pi = (int*)malloc(sizeof(int))))
        {
            fprintf(stderr, "Insufficient Memory\n");
            exit(EXIT_FAILURE);
        }

        *pi = 5;
        printf("%d", *pi);
        free(pi);
    }

它们有什么区别?谢谢!

最佳答案

当您将 int * var 传递给 malloc_and_check 时,您正在更新指针的本地副本,因此原始指针不会发生变化。您可以通过两种方式解决此问题:
(a) 从 malloc_and_check

返回指针
int * malloc_and_check()
{
    int * var = 0;
    if(!(var = (int*)malloc(sizeof(int))))
    {
        fprintf(stderr, "Insufficient Memory\n");
        return 0;
    } 
    return var;
}  

然后你会称它为

pi = malloc_and_check();

(b) 传入一个指向指针的指针

void malloc_and_check(int ** var)
{
    if(!( *var = (int*)malloc(sizeof(int))))
    {
        fprintf(stderr, "Insufficient Memory\n");
        exit(EXIT_FAILURE);
    } 
}  

然后你会把它作为

 malloc_and_check(&pi);

关于c - 动态数组和函数化 malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40253875/

相关文章:

c - Solaris cc 是否在可执行文件中嵌入了不同编译的不同信息?

c - 为什么控制转到 else block 进行此条件检查?

c++ - 确定调用线程正在哪个 CPU 上运行?

c++ - 为什么这个十六进制值输出为负数?

c - 使用 C 返回数组

c++ - 如何在 C 或 C++ 中创建动态堆栈的动态数组

C# 如何在 Byte[] 中设置 0x..

javascript - 根据按钮元素层次结构位置收集输入值

java - 我有一个对象数组,每个对象都分配了一个日期,如何按日期顺序对这些对象进行排序?

python - 迭代使用自己输出的数组的最佳方法