我的代码中出现了分段错误。 我已将代码缩小到这个简化版本。我删除了明显的malloc检查,因为malloc没有失败。 当我尝试访问do_something中的[0]时出现错误,但是当我尝试在give_mem_and_do中访问相同内容时它不会失败。 我无法理解其中的原因。 我正在传递已在堆上分配的位置的地址。 那么为什么它在访问这个位置时失败呢。
#include <stdio.h>
#include <stdlib.h>
struct abc
{
int *a;
int b;
};
typedef struct abc thing;
int do_something( thing ** xyz, int a)
{
printf ("Entering do something \n");
(*xyz)->a[0] = a;
return 0;
}
int give_mem_and_do (thing ** xyz, int *a)
{
int rc;
printf ("\n Entered function give_mem_and_do \n");
if (*xyz == NULL)
{
*xyz = (thing *)malloc ( sizeof (thing) );
(*xyz)->a = (int *) malloc (sizeof (int)*100);
}
printf (" Calling do_something \n");
rc = do_something (xyz, *a);
return 0;
}
int main ()
{
thing * xyz;
int abc = 1000;
give_mem_and_do (&xyz,&abc);
#include <stdio.h>
#include <stdlib.h>
struct abc
{
int *a;
int b;
};
typedef struct abc thing;
int do_something( thing ** xyz, int a)
{
printf ("Entering do something \n");
(*xyz)->a[0] = a;
return 0;
}
int give_mem_and_do (thing ** xyz, int *a)
{
int rc;
printf ("\n Entered function give_mem_and_do \n");
if (*xyz == NULL)
{
*xyz = (thing *)malloc ( sizeof (thing) );
(*xyz)->a = (int *) malloc (sizeof (int)*100);
}
printf (" Calling do_something \n");
rc = do_something (xyz, *a);
return 0;
}
int main ()
{
thing * xyz;
int abc = 1000;
give_mem_and_do (&xyz,&abc);
return 0;
}
以下是此代码的输出
Entered function give_mem_and_do
Calling do_something
Entering do something
Segmentation fault (core dumped)
答案 0 :(得分:4)
将xyz
中的main
初始化为NULL
,作为
int main ()
{
thing * xyz = NULL;
...
}
否则,*xyz
可能不为NULL,give_mem_and_do
不会为必需的指针分配内存。