繁体   English   中英

初始化struct时出现分段错误

[英]Segmentation Fault when initializing struct

无法弄清楚为什么我会遇到使用较长段代码的分段错误。

我拿这个并运行得很好。

struct Earthquake
    {
        char *prevString;
        char *magString;
        char *postString;
    };  
int main(void)
{
    struct Earthquake eq;
    eq.prevString="PREVIOUS STRING";
    eq.magString = "50";
    eq.postString = "POST STRING";

    printf("\n%s",eq.prevString);
    printf("\n%s",eq.magString);
    printf("\n%s\n",eq.postString);
}

当我尝试运行这个时,我得到一个分段错误,如果我注释掉struct初始化,我就会停止。 你可能能够告诉我已经注释掉了什么,但是一旦我开始工作,我正在尝试制作一个结构数组,此时我知道eq需要是一个地震指针,但我甚至无法使这个工作。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
//#include <stddef.h>
//#include <paths.h>

struct Earthquake
{
    char *prevString;
    char *magString;
    char *postString;
};


int main()
{
    int numLines = 0;
    FILE *fileA = fopen("./all_month.csv", "r");
    char c[1];

    do
    {
        *c = fgetc(fileA);
        //printf("%c", c);

    }while(*c != '\n');

    do
    {
        *c = fgetc(fileA);
        //printf("%c", c);
        if(*c == '\n')
        {
            numLines++;
        }

    }while(*c != EOF);

    //printf("%d",numLines);
    fclose(fileA);
    FILE *fileB = fopen("./all_month.csv", "r");
    char prevStringTemp[60];
    char postStringTemp[150];
    char magStringTemp[10];

    struct Earthquake eq; 
    //if(NULL == (entries = (Earthquake *)malloc(sizeof(Earthquake) * numLines)));
    //printf("\nmalloc failed\n");

    do
    {
        *c = fgetc(fileB);
        //printf("%c", c);

    }while(*c != '\n');
    char line[200];
    int commaCount = 0;
    do{
        *c = fgetc(fileB);
        if(*c==',')
        {
            commaCount++;
            //printf("\n%d", commaCount);
        }
        strcat(prevStringTemp, c);
    }while(commaCount<4);

    do
    {
        *c = fgetc(fileB);
        strcat(magStringTemp, c);
    }while(*c!=',');

    do
    {
        *c = fgetc(fileB);
        strcat(postStringTemp, c);
    }while(*c!='\n');

    //strcpy(entries[0].prevString, prevString);
    //printf(entries[0].prevString);

    //fscanf(fileB,"%s",line);

    //printf("\n%s\n", line);
    fclose(fileB);
    //free(entries);
    return 0;
}

这就是问题

strcat(prevStringTemp, c);

因为strcat()期望nul终止字符串,而这些字符串在你的情况下是参数。

你的c数组应该是

char c[2] = {0};

以及这些的第一要素

char prevStringTemp[60];
char postStringTemp[150];
char magStringTemp[10];

应该像这样初始化为'\\0'

prevStringTemp[0] = '\0';
postStringTemp[0] = '\0';
magStringTemp[0]  = '\0';

修复此问题后, strcat()将按预期运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM