gpt4 book ai didi

c - C程序中的段错误,使用malloc(Linux操作系统)

转载 作者:行者123 更新时间:2023-11-30 20:17:51 28 4
gpt4 key购买 nike

此 c 程序在 Windows 中可以运行,但在 Linux 中出现“段错误(核心转储)”。我猜是错误指针或 malloc 函数的原因。如果没有指针和 malloc,我无法返回结构数组。

struct team {
char name[12];
int m_count;
int score;
};

struct team *teamName(){

FILE *fp;
fp=fopen("teams.txt", "r");

struct team *items;
items= (struct team *) malloc(sizeof(struct team) * 10);

int i;
for(i=0; i<10; i++)
{
fscanf(fp, "%s\n" , items[i].name);
}

fclose(fp);
return items;
}

int main(void)
{ struct team *items = teamName();
getMatch(items);
}

最佳答案

您的代码中有几个问题:

  • 您没有检查fopen是否成功

  • 您不检查fscanf是否成功,如果读取名称大于 11,您就会以未定义的行为从缓冲区中写入

  • 为什么\n采用fscanf格式?

  • 如果您读取的名称少于 10 个,则某些条目不会设置,以后可能会出现未定义行为的风险

<小时/>

考虑到我的言论的提案可以是:

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

struct team {
char name[12];
int m_count;
int score;
};

struct team *teamName(){
FILE *fp = fopen("teams.txt", "r");

if (fp == NULL)
return NULL;

struct team *items = malloc(sizeof(struct team) * 10);

int i;

for (i=0; i<10; i++)
{
if (fscanf(fp, "%11s" , items[i].name) != 1) {
/* empty other names */
do {
items[i].name[0] = 0;
}
while (++i != 10);
break;
}
}

fclose(fp);
return items;
}

int main(void)
{
struct team *items = teamName();

if (items != NULL) {
for (int i = 0; i != 10; ++i) {
if (items[i].name[0] != 0)
puts(items[i].name);
}
}

/* getMatch(items); */
}

编译和执行:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra -Wall m.c
pi@raspberrypi:/tmp $ cat teams.txt
aze qsd
loop
bar
pi@raspberrypi:/tmp $ ./a.out
aze
qsd
loop
bar
pi@raspberrypi:/tmp $

请注意fscanf读取单词,我的意思是名称不能包含空格,否则您需要使用例如fgets

关于c - C程序中的段错误,使用malloc(Linux操作系统),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55891203/

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