gpt4 book ai didi

C - 输出包含空值和段错误

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

该程序应该创建一个结构数组,其中包含代码开头硬编码的名称和年龄数组中的名称和年龄值。我被明确要求在主函数中声明数组,然后在插入函数中为其分配内存。该程序编译良好,我应该得到的输出是:

姓名:西蒙

年龄:22

姓名:苏西

年龄:24

姓名:阿尔弗雷德

年龄:106

名称:芯片

年龄:6 岁

等等。等等

但是我得到的输出是这样的:

姓名:西蒙

年龄:22

名称:(空)

年龄:33

姓名:苏西

年龄:24

名称:(空)

年龄:33

姓名:苏西

年龄:24

......段错误。

有些名称出现两次,有些名称为空,并且输出末尾存在段错误。任何帮助将不胜感激。非常感谢。

    #include <stdio.h>
#include <stdlib.h>

/* these arrays are just used to give the parameters to 'insert',
to create the 'people' array
*/

#define HOW_MANY 7
char *names[HOW_MANY]= {"Simon", "Suzie", "Alfred", "Chip", "John", "Tim",
"Harriet"};
int ages[HOW_MANY]= {22, 24, 106, 6, 18, 32, 24};

/* declare your struct for a person here */
struct person {
char *name;
int age;
};

static void insert(struct person **arr, char *name, int age)
{
//initialise nextfreeplace
static int nextfreeplace = 0;
//allocate memory
arr[nextfreeplace] = malloc (sizeof(struct person));
/* put name and age into the next free place in the array parameter here */
arr[nextfreeplace]->name = name;
arr[nextfreeplace]->age = age;
/* modify nextfreeplace here */
nextfreeplace++;
}

int main(int argc, char **argv)
{

/* declare the people array here */
struct person *people;

for (int i = 0; i < HOW_MANY; i++)
{
insert (&people, names[i], ages[i]);
}

/* print the people array here*/
for (int i = 0; i < HOW_MANY; i++)
{
printf("Name: %s \t Age: %i \n", people[i].name, people[i].age);
}

return 0;
}

最佳答案

在你的代码中,你有

#define HOW_MANY 7
/* ... */
struct person {
/* ... */
};

static void insert(struct person **arr/* ... */) {
static int nextfreeplace = 0;
/* ... */
arr[nextfreeplace] = malloc(sizeof(struct person));
/* ... */
nextfreeplace++;
}

int main(int argc, char **argv) {
/* ... */
struct person *people;

for (int i = 0; i < HOW_MANY; i++) {
insert(&people/* ... */);
}
/* ... */
return 0;
}

问题在于您将名为 people 的变量定义为指针。然后将该指针的地址传递给 insert。由于局部变量(通常)是在堆栈上分配的,因此在 insert 中进行的分配会覆盖其中的一部分。

假设你有

struct person *people;
struct person *otherpeople;

然后,当您有 nextfreeplace == 0 时,您可以分配给 arr[0] == *arr,这样就可以了。但对于 nextfreeplace == 1,您分配给 arr[1] == *(arr+1) == otherpeople

这种类型的错误称为缓冲区溢出。

要修复此错误,您需要使用 struct person *people[HOW_MANY];insert(people/* ... */);

附注:您还应该使用 free 释放您分配的且不再需要的内存。

关于C - 输出包含空值和段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45400631/

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