#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;
}
我的代码导致分段错误。任何人都可以解释原因吗?
答案 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)
以下提议的代码:
现在是代码:
#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 );
}