c - Linux 中出现段错误,但在 Mac 中正常

标签 c linux eclipse xcode

我有一个在 Xcode 中在我的 Mac 笔记本电脑上编写的 C 代码,但它在 Linux 系统中不起作用。

我通过两种方式运行此代码:

1.One 在 Eclipse 中运行,但 while 循环看起来没有完成。请查找以下消息:

Please wait while calculating...

但控制台中没有更多消息。看起来 while 循环由于某种原因无法完成。

2.第二种方式是我直接在Linux环境下通过命令编译代码:

cc -std=c99 main.c -o main

然后通过命令运行:

./main

消息显示:

Please wait while calculating... Segmentation fault (core dumped)

我通过gdb检查

Program received signal SIGSEGV, Segmentation fault. 0x00007ffff7a9bd4a in ?? () from /lib/x86_64-linux-gnu/libc.so.6

我的数据保存在:

/home/alan_yu/workspace/scandi.csv

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <time.h>

char **split(char *line, char sep, int fields) {

    char **r = (char **)malloc(fields * sizeof(char*));

    int lptr = 0, fptr = 0;

    r[fptr++] = line;

    while (line[lptr]) {

        if (line[lptr] == sep) {

            line[lptr] = '\0';

            r[fptr] = &(line[lptr+1]);

            fptr++;

        }

        lptr++;

    }

    return r;

}

int cmpfunc (const void * a, const void * b)

{

    return *(double *)a > *(double *)b ? 1 : -1;

}

#define LINE_SIZE 1000000

#define EXPECTED_STOCK_SIZE 10000000

void calculate2(char * fileName) {

     printf("Please wait while calculating...\n");

    // Open the file for reading.

    FILE *file = fopen(fileName, "r");

    // maximun size of the line to read.

    // memory allocation for the line to read.

    char* line = malloc(LINE_SIZE);

//    char **stockNameArray = malloc( sizeof(char *) * EXPECTED_STOCK_SIZE);

//    int stockNameArrayPos = 0;

    double *bidArray = malloc( sizeof(double) * EXPECTED_STOCK_SIZE );

    int bidArrayPos = 0;

    double *askArray = malloc( sizeof(double) * EXPECTED_STOCK_SIZE);

    int askArrayPos = 0;

    double *spreadArray = malloc( sizeof(double) * EXPECTED_STOCK_SIZE);

    int spreadArrayPos = 0;

    double sum=0;

    int i=0,j=0;

    while (fgets(line, LINE_SIZE, file)!= NULL){

    //  printf("Please wait while ...%d\n ", j);
        j++;
        char **fields = split(line, ',', 15);

        const char * volvbEquity = "VOLVB SS Equity";

        int comp = strcmp(fields[0], volvbEquity);

        if (comp == 0) {

            double bidValue = atof(fields[2]);

            double askValue = atof(fields[3]);

            bidArray[bidArrayPos++] = bidValue;

            askArray[askArrayPos++] = askValue;

            if (askValue - bidValue > 0) {

                double spreadValue = ((askValue - bidValue) / (askValue + bidValue) * 20000);

                spreadArray[spreadArrayPos++] = spreadValue;

                sum = sum + spreadValue;

            }

        }

    }


    //quick sort the spread

    qsort(spreadArray, spreadArrayPos, sizeof(double), cmpfunc);

    int mediumPos;

    double mean;

    double medium;

    if(spreadArrayPos % 2 == 0) {

        mediumPos = spreadArrayPos / 2;

        medium = (spreadArray[mediumPos] + spreadArray[mediumPos+1]) / 2;

    } else {

        mediumPos = (spreadArrayPos)/2 + 1;

        medium = spreadArray[mediumPos];

    }

    mean = sum / spreadArrayPos;

    printf("Please find mean and medium %f %f\n", mean, medium);

    free(bidArray);

    free(askArray);

    free(spreadArray);

}

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

    calculate2("/home/alan_yu/workspace/scandi.csv");

    return(0);

}

最佳答案

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

void split(char *line, char sep, char **fields) {

    int lptr = 0, fptr = 0;

    fields[fptr++] = line;

    while (line[lptr]) {

        if (line[lptr] == sep) {

            line[lptr] = '\0';

            fields[fptr] = &(line[lptr+1]);

            fptr++;

        }

        lptr++;

    }
}

int cmpfunc (const void * a, const void * b) {
    return *(double *)a > *(double *)b ? 1 : -1;
}

#define LINE_SIZE 1000000

#define EXPECTED_STOCK_SIZE 10000000

#define COLUMN_NUM 15

void calculate2(char * fileName) {

     printf("Please wait while calculating...\n");

    // Open the file for reading.
    FILE *file = fopen(fileName, "r");

    // maximun size of the line to read.
    // memory allocation for the line to read. 
    char* line = malloc(LINE_SIZE);

//    char **stockNameArray = malloc( sizeof(char *) * EXPECTED_STOCK_SIZE);
//    int stockNameArrayPos = 0;

    double *bidArray = malloc( sizeof(double) * EXPECTED_STOCK_SIZE );

    int bidArrayPos = 0;

    double *askArray = malloc( sizeof(double) * EXPECTED_STOCK_SIZE);

    int askArrayPos = 0;

    double *spreadArray = malloc( sizeof(double) * EXPECTED_STOCK_SIZE);

    int spreadArrayPos = 0;

    double sum=0;

    int i=0,j=0;

    while (fgets(line, LINE_SIZE, file)!= NULL){

    //  printf("Please wait while ...%d\n ", j);
        j++;
        char **fields = malloc(sizeof(char *) * COLUMN_NUM);
        split(line, ',', fields);

        const char * volvbEquity = "VOLVB SS Equity";

        int comp = strcmp(fields[0], volvbEquity);

        if (comp == 0) {

            double bidValue = atof(fields[2]);

            double askValue = atof(fields[3]);

            bidArray[bidArrayPos++] = bidValue;

            askArray[askArrayPos++] = askValue;

            if (askValue - bidValue > 0) {

                double spreadValue = ((askValue - bidValue) / (askValue + bidValue) * 20000);

                spreadArray[spreadArrayPos++] = spreadValue;

                sum = sum + spreadValue;

            }

        }

        // free memory for fields.
        free(fields);

    }

    // free memory for the line variable.
    free(line);

    //quick sort the spread
    qsort(spreadArray, spreadArrayPos, sizeof(double), cmpfunc);

    int mediumPos;
    double mean;
    double medium;

    if(spreadArrayPos % 2 == 0) {
        mediumPos = spreadArrayPos / 2;
        medium = (spreadArray[mediumPos] + spreadArray[mediumPos+1]) / 2;

    } else {
        mediumPos = (spreadArrayPos)/2 + 1;
        medium = spreadArray[mediumPos];
    }

    mean = sum / spreadArrayPos;

    printf("Please find mean and medium %f %f\n", mean, medium);

    free(bidArray);

    free(askArray);

    free(spreadArray);

}

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

    calculate2("/home/alan_yu/workspace/scandi.csv");

    return(0);

}

关于c - Linux 中出现段错误,但在 Mac 中正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32564233/

相关文章:

c - 测试用例中的段错误

c++ - C/C++ 确定程序运行的驱动器

windows - Eclipse W10 Rust 配置 "RLS"

java - 如何使用 Java 7 和 Maven 在 Eclipse Kepler 中运行 JSR 269 注释处理器

Eclipse 中的 JavaScript 编辑器

c - 在C中,如何定期向多个对等点(可能是数千个)发送UDP数据报?

c - 串口监视器中的Arduino换行符(帮助)

linux - 创建的文件何时对 ext4 中的其他进程可见?

linux - 在一台机器上模拟telnet通信

c - 更改数据包以使用 AEH/ESP 保护它