【问题标题】:Segmentation fault (core dumped) in c (sending text to array)c中的分段错误(核心转储)(将文本发送到数组)
【发布时间】:2014-03-10 22:08:47
【问题描述】:

我正在编写从命令行(重定向的文本文件)获取输入并将数据发送到 c 中的数组的代码。但是,每当我运行它时,都会出现分段错误(核心转储)错误。这是我的代码:

  int main(int argc, const char * argv[])
{
    char *experiments[20];
    int data[10][20];

int b=0;
char *name = NULL;
name=malloc(100);
sendToArray(data, experiments);
while(b==0){
    int input=0;
    printf("\n");
    printf("Data set analysis\n");
    printf("1. Show all the data\n");
    printf("2. Calculate the average for an experiment\n");
    printf("3. Calculate the average across all experiments\n");
    printf("4. QUIT\n");
    printf("Selection: ");
    scanf("%d", &input);

    switch (input) {
        case 1:
            if(argc!=0){
                displayAll(data, experiments);
            }
            else{
                printf("Oops, something went wrong!\n");
            }
            break;
        case 2:
            if(argc!=0){
                printf("\n");
                printf("Enter the name of the experiment: ");
                scanf("%[^\n]", name);
                individualAverage(name, experiments, data);
            }
            else{
                printf("Oops, something went wrong!\n");
            }
            break;
        case 3:
            if(argc!=0){
                allAverage(experiments, data);
            }
            else{
                printf("Oops, something went wrong!\n");
            }
            break;
        case 4:b=1;;
            break;

        default:
            printf("Oops, something went wrong!\n");
            break;
    }
}
return 0;

}

这是main的开头,调用了这个函数:

void sendToArray(int data[10][20], char *experiments[20]){
char line[100];
char line2[100];


char *temp1;
int temp;
int i=0, c=0;
while(!strcmp(line, "*** END ***")){
    scanf("%[^\n]", line);
    scanf("%*c");
    scanf("%[^\n]", line2);
    scanf("%*c");
    for(i=0; i<10; i++){

        temp1 = strtok(line2, " ");
        temp = atoi(temp1);
        data[c][i] = temp;
    }
    experiments[c] = line;
    c++;

}
numExperiments = c+1;


}

我将函数更改为为每行分配 100 位内存,但我仍然得到核心转储。此外,如果我确实重定向了一个文本文件,程序将无限循环通过 main。 谢谢谁能帮我找出我的错误!

这是我的示例输入文件!,在 bash 中由 ./dataset 调用

Experiment One
3 10 8 7 3 2 9 7 5 6
Experiment Two
10 20 30 40 50 60 70 80 90 100
Control Group
5 5 5 5 5 5 5 5 5 5
*** END ***

好的,谢谢大家,我修复了内存转储,但是,每当我通过管道传输文本文件时,程序仍然无限循环。

【问题讨论】:

  • 如果您提供了示例输入文件,人们可能会提出解决问题的好方法,而不仅仅是纠正少数错误。
  • 现在您需要更正我的回答中指出的其他错误。
  • while(!strcmp(line, "*** END ***")) { 可能永远不会运行循环......它会在一行 isn't "*** END ***" 时终止。
  • @dmitri 你确定吗?有没有!不改吗?
  • ...不过还有很多其他问题。

标签: c arrays coredump


【解决方案1】:

问题是您从不为 line 和 line2 分配内存。 您可以将它们声明为适当的数组,例如:

char line[32];
char line2[32];

这是导致分段错误的原因,但修复了您会遇到另一个错误:您正在将本地地址传递给实验数组。您可以通过通过 malloc 分配线阵列,或通过为实验分配适当的内存,然后按照 strcpy 或其他方式复制每个字符串来解决此问题。 另外,我很确定

scanf("%[^\n]\n", line);

无效。你想要的是

scanf("%[^\n]", line);
scanf("%*c");

【讨论】:

  • 或在本地缓冲区上使用strdup
【解决方案2】:

您引用data[c][i] 而不检查c&lt;20。这是非常不安全的,并且可能导致非法内存访问(段错误)。

尝试将c 限制为低于 20。您仍然收到错误吗?

【讨论】:

  • 确保添加!
猜你喜欢
  • 1970-01-01
  • 2022-01-14
  • 2017-02-25
  • 2016-07-12
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多