我已经删除了一个结构并分配了一些内存。使用功能我更新数据。我在处理数据时遇到错误分段错误。
这是我的代码
在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时都会打印。
答案 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;
}
<强>第二强>
然后在这里(假设na
是char*
正确初始化以引用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;
}
...
}
注意:
malloc()
)并设计您的函数,以便能够将失败传递给调用者。malloc()
, calloc()
and realloc()
in C. It is not needed nor recommended. size_t
而非int
的内存大小和索引。 size_t
不会浪费一些负数,并且保证足够大以解决任何数组问题。元素或表示任何内存大小。 sizeof
以及strlen()
返回size_t
而不是int
。答案 1 :(得分:0)
当您致电update()
时,您正在传递当前索引的<{1}} 作为参数。
但是,您仍然会在place **
分配内存时传递index
,就像它是指向memallocate()
的指针一样。
因此,有必要从place *[]
和index
中删除参数update()
,并将内存分配更改为:
memallocate()