我程序中的分段错误

时间:2017-08-19 08:19:50

标签: c function pointers segmentation-fault malloc

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

void memory_allocate(int *ptr)
{
    ptr=(int*)malloc(sizeof(int)*100);
}

int main()
{
    int *ptr1;
    memory_allocate(ptr1);
    *ptr1=12;
}

我的代码导致分段错误。任何人都可以解释原因吗?

4 个答案:

答案 0 :(得分:4)

问题在于,当函数设置ptr时,新指针值不会传回ptr1

使这项工作的一种方法是使用指向指针的指针:

void memory_allocate(int** ptr)
{
   (*ptr) = (int*)malloc(sizeof(int)*100);
}

int main()
{
   int *ptr1;
   memory_allocate(&ptr1);
   *ptr1=12;
   /* TODO: free memory here */
}

答案 1 :(得分:1)

在分配内存时分配给ptr的本地副本。这在memory_allocate函数之外是不可见的。

答案 2 :(得分:1)

参数总是按C中的值传递。即使看起来你正在“传递指向函数的指针”,你实际上是将指针的传递给函数(值存储在变量ptr1内的地址,而不是指针本身。

所以你可以想象这在功能上类似于:

int main()
{
   int *ptr1;

   // pass the value of ptr1 to memory_allocate
   {
       var tmp = ptr1;

       // this doesn't change the original variable
       tmp = malloc(sizeof(int) * 100);
   }

   *ptr1 = 12;
}

这并不意味着您无法更改存储在该地址的值,因为您可以轻松取消引用该函数内的指针,但这意味着您永远不能更改原始变量的值,除非您通过指向函数的实际变量的指针,如上面@NPE所解释的那样。

答案 3 :(得分:0)

以下提议的代码:

  1. 干净地编译
  2. 没有任何内存泄漏
  3. 在调用系统函数时检查错误
  4. 正确传递指针的地址,以便子函数可以改变指针指向的位置。
  5. 记录了为什么要包含每个头文件
  6. 正确初始化局部变量
  7. 现在是代码:

    #include <stdio.h>   // perror()
    #include <stdlib.h>  // malloc(), free(), exit(), EXIT_FAILURE
    
    // prototypes
    void memory_allocate(int **ptr);
    
    
    void memory_allocate(int **ptr)
    {
        *ptr = malloc(sizeof(int)*100);
        if( !ptr )
        {
            perror( "malloc failed" );
            exit( EXIT_FAILURE );
        }
    }
    
    
    int main( void )
    {
        int *ptr1 = NULL;
        memory_allocate(&ptr1);
        *ptr1=12;
        free( ptr1 );
    }