C语言在linux下编译通过,一运行就段错误

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include "stuscore.h"

#define N 3

struct student data[N];

void get(struct student *d,int n);
void calculate(struct student *d,int n);
void output(struct student *d,int n);

int main()
{
struct student *d;
d=(struct student*)malloc(sizeof(*d)*N);
get(data,N);
calculate(data,N);
output(data,N);
}
void get(struct student *d,int n)
{
int i;
FILE *r=fopen("students.txt","r");
for(i=0;i<n;i++)
{
fscanf(r,"%s%f%f%f%f",&d[i].name,&d[i].math,&d[i].ch,&d[i].en,&d[i].phy);
}
fclose(r);
}
void calculate(struct student *d,int n)
{
int i;
for(i=0;i<n;i++)
{
d[i].sum=d[i].math+d[i].ch+d[i].en+d[i].phy;
d[i].ave=d[i].sum/4;
}
}
void output(struct student *d,int n)
{
int i;
printf("name match chinese english physical sum ave\n");
for(i=0;i<n;i++)
{
printf("%s %.2f %.2f %.2f %.2f %.2f %.2f\n",d[i].name,d[i].math,d[i].ch,d[i].en,d[i].phy,d[i].sum,d[i].ave);
}
}
该代码在windows下vs能正常运行,但是学linux用gcc编译后,一运行就段错误

linux里面段错误就是内存访问的错误了,应该是你代码里的内存分配有问题,因为没看到你这里的struct studen的具体定义,只能让你注意看下studen的name这个字符串的定义,txt文件里的name字段有没有超出这个name的定义长度,如果超出了,fscanf就会报内存错误了追问

没有超出,windows下用vs运行都没问题

追答

建议在程序某些位置加入打印输出,以便确定错误发生的语句

追问

只是linux下编译出问题

温馨提示:内容为网友见解,仅供参考
第1个回答  2018-03-06
程序不完整哦,无法测试,请给出stuscore.h及其实现。追问

头文件中,就声明了struct中的属性

第2个回答  2018-03-06
报什么错?依赖问题吧,不同系统库文件又不是一致的。追问

运行直接显示段错误

C语言在linux下编译通过,一运行就段错误
linux里面段错误就是内存访问的错误了,应该是你代码里的内存分配有问题,因为没看到你这里的struct studen的具体定义,只能让你注意看下studen的name这个字符串的定义,txt文件里的name字段有没有超出这个name的定义长度,如果超出了,fscanf就会报内存错误了 ...

c语言程序通过编译,运行时提示 core dumped
linux下的段错误:segmentation fault (core dumped)和windows下的运行时错误道理是一样,一般都是内存被踩访问越界了导致。肯定是代码的某处逻辑有问题,访问了野指针啊之类的。

C语言为什么会出现:编译通过,执行失败 的情况?
错在 scanf("%d",a); -- 应当是 scanf("%d",&a);编译通过,执行失败!

帮忙看下以下的C语言程序,哪里有问题了,为什么Linux上编译执行会出现段...
可能是strcpy(c,a);时越界,a中直到遇到'\\0'才会拷贝结束,你试试把a最后一个设为'\\0'

kali linux的gcc编译完的C语言小程序,为什么执行后显示段错误?求各位...
scanf里边不能含有除格式之外的东西,像你这里有The th level.是不行的。把scanf这一句改为 scanf("%d",&n);如果要显示输入的n的多少,就再加一句 printf("The %dth level.\\n",n);

Linux下一个C语言程序 运行后出现Segmentation fault (core dumped...
您可以gcc -g标签,生成可调试的文件。出错后会生成一个core文件 您输入命令gdb a.out -c core,进入gdb的命令界面后,输入bt,就可以显示您当前发生段错误的代码。我运行的时候,一直输出"can not found"。

执行linux定时脚本是报错 Segmentation fault,求高手指正!在线等。_百 ...
可以打印出发生段错误的时候的脚本中传递给程序的参数值,然后另开终端以此参数值调用下程序看下。段错误,百分之99可能是在你自己写的程序(曾经我写程序也经常出现段错误,c语言很正常的)。重点查看传入参数导致程序路径或者变量地址的引用是否越界 ...

C语言编译之后出现Segmentation fault (core dumped)的错误
这应该是Linux下面按照C99标准编写的代码,不然在C89标准的编译器下是无法通过编译的。Linux下的段错误:Segmentation fault (core dumped)和Windows下的运行时错误道理是一样,一般都是内存被踩访问越界了导致。肯定是代码的某处逻辑有问题,访问了野指针啊之类的。

C语言 文件方面 段错误 核心已转储 以及字符串查找删除的问题_百度知 ...
can't open file!\\n"); if (success) { remove(filename); rename(filename1, filename); }【测试】原a.txt内容为:abcdefghijklmn1234567890a1a2abc123a4a5a6b1b2b3b4bccccc运行程序后为:abcdefghijklmn1234567890a1a2a4a5a6b1b2b3b4bccccc 注意:原a.txt文件中最后一行后面不换行结束。

c语言指针问题,为什么我输入很多个都没有显示错误?
因为C语言不提供内存越界访问检查机制,p在堆内存上申请了一个char长度空间(注意:malloc实际分配的内存有可能比请求的稍微多一点,但是这个行为是由编译器定义的,所以不能指望它肯定会分配比请求更多的内存)。你在随后输入一个字符串时候,通过scanf函数读取到p指针指向的内存中,虽然只申请了一个字节...

相似回答