当从main函数调用结构值时,不能打印值

时间:2015-03-15 11:05:06

标签: c pointers structure function-pointers dynamic-memory-allocation

我已经删除了一个结构并分配了一些内存。使用功能我更新数据。我在处理数据时遇到错误分段错误。

这是我的代码

在headerfile中:

typedef struct
{
int member;
char *name;
}place;

void update(place **,int);
void display(place **,int);

在功能

static memallocate(place **ptr,int viname,int index)
{

 ptr[index]=(place *)malloc(sizeof(place));
 ptr[index]->name=(char *)malloc(viname*sizeof(char *));

}

void update(place **ptr,int index)
{
 ---read string value "na" find the strlen as "pp"---
 memallocate(ptr,pp,index);
 ptr[index]->name=na;

}

void display(place **ptr,int index)
{
 int i;
 for(i=0;i<index;i++)
  {
    printf("%s\n",ptr[i]->name);
    printf("%s\n",ptr[i]->country);
  }
}

在主文件中:

void main()
{
 int index=0;
 place *pla[5]={NULL};
 while(index<2)
 {
    update(&pla[index],index);
    index++;
 }
 display(pla,index);
}

我的问题是,当访问函数display并且无法打印数据ptr [0] - &gt; name,ptr [0] - &gt; country,ptr [1] - &gt时,我遇到了分段错误; name,ptr [1] - &gt; country ..为什么会这样?任何内存故障。我在每次更新后使用printf时都会打印。

2 个答案:

答案 0 :(得分:2)

我在这里看到两个市长问题。

<强>第一

下面

static void memallocate(place **ptr,int viname,int index)
{
  ptr[index]=(place *)malloc(sizeof(place));
  ptr[index]->name=(char *)malloc(viname*sizeof(char *));  
}

你分配了太多的内存。它应该是

static void memallocate(place ** ptr, int viname, int index)
{
  ptr[index] = malloc(sizeof(place));
  ptr[index]->name = malloc(viname * sizeof(char));  
}

甚至更好:

static int memallocate(place ** ptr, size_t viname, size_t index)
{
  int result = 0;

  if (NULL == ptr)
  {
    result = -1;
    errno = EINVAL;
  }
  else
  {
    ptr[index] = malloc(sizeof *ptr[index]);
    if (NULL == ptr[index])
    {
      result = -1;
    }
    else
    {
      ptr[index]->name = malloc(viname * sizeof *(ptr[index]->name));  
      if (NULL == ptr[index]->name)
      {
        result = -1;
        free(ptr[index]);
      }
    }
  }

  return result;
}

<强>第二

然后在这里(假设nachar*正确初始化以引用C - &#34;字符串&#34;)

void update(place **ptr,int index)
{
  ---read string value "na" find the strlen as "pp"---
  memallocate(ptr,pp,index);
  ptr[index]->name=na;
}

您覆盖刚刚分配给name的内容。复制C - &#34;字符串&#34;使用strcpy()

int update(place ** ptr, size_t index)
{
  ---read string value "na" find the strlen as "pp"---
  int result = memallocate(ptr, pp, index)
  if (-1 == result)
  {
    perror("memallocate() failed");
  }
  else
  { 
    strcpy(ptr[index]->name, na);
  }

  return result;
}

然后这样称呼:

int main(void)
{
  size_t index = 0;
  place * pla[5] = {NULL};

  /* Loop over all array's elements. */
  while (index < sizeof pla/sizeof *pla)
  {
    update(pla, index);
    ++index;
  }

  ...
}

注意:

答案 1 :(得分:0)

当您致电update()时,您正在传递当前索引的<{1}} 作为参数。

但是,您仍然会在place **分配内存时传递index,就像它是指向memallocate()的指针一样。

因此,有必要从place *[]index中删除参数update(),并将内存分配更改为:

memallocate()