gpt4 book ai didi

从主函数调用结构值时无法打印值

转载 作者:行者123 更新时间:2023-11-30 18:54:59 25 4
gpt4 key购买 nike

我已经声明了一个结构并分配了一些内存。使用函数我更新数据。我在访问数据时遇到错误段错误。

这是我的代码

在头文件中:

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]->name,ptr[0]->country,ptr[1]->name ,ptr[1]->国家..为什么会发生这种情况?任何内存故障。每次更新后我使用 printf 时都会得到打印。

最佳答案

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

第一

这里

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-“字符串”)

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

您将覆盖刚刚分配给名称的内容。要复制 C-“字符串”,请使用 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;
}

...
}

注释:

关于从主函数调用结构值时无法打印值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29059890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com