【问题标题】:C segmentation fault 11C 分段错误 11
【发布时间】:2014-04-12 05:40:39
【问题描述】:
#include <stdio.h>
#include <string.h>

int numExperiment=1;

int main(int argc, const char * argv[])
{
    char* experiments[20];
    int data[10][20];
    char* input;
    char* endof = "***END***";

    do {
        input=fgets(input, 20, stdin);

        if (numExperiment%2 != 0) {
            experiments[numExperiment-1]=strdup(input);
        }
        else {
            int k=0;
            while ((data[k][numExperiment-1]=strsep(&input, " ") !=NULL)) {
               k++;
            }
        }

        numExperiment++;
    } while (strcmp(input, endof)!=0);
    return 0;
}

我写了这段代码,它编译没有问题,但是当我运行它时,我不断收到这个错误:
“分段错误:11”。

这段代码应该做的是读取一个文件并将奇数行上的所有数据放入一个数组中,将偶数行上的数据放入二维数组中。我正在使用命令行重定向来读取文件。

如果有人能指出我如何纠正这个问题的正确方向,那就太好了。

编辑 1:我对分配内存和 fgets 进行了以下建议的更改,但我仍然遇到分段错误 11。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 1000

int numExperiment=1;

int main(int argc, const char * argv[])
{

    char* experiments[20];

    int data[10][20];
    char* input=malloc(N);
    char* endof="***END***\n";


    do {




        if (fgets(input, N, stdin) == NULL) break;


        if (numExperiment%2 != 0) {
        experiments[numExperiment-1]=strdup(input);
        }

        else {
            int k=0;
            while ((data[k][numExperiment-1]=strsep(&input, " ") !=NULL)) {
                k++;
            }


        }


        numExperiment++;



    } while ((fgets(input, N, stdin) != NULL) && (strcmp(input, endof)!=0));

    free(input);




    return 0;
}

【问题讨论】:

  • 在写入之前需要为input分配空间..
  • 您要么需要使用mallocinput 分配一个指向某些内存的指针(当前没有有效的指针),要么将input 声明为静态定义的空间,例如, char input[20];.

标签: c file segmentation-fault command-line-arguments tokenize


【解决方案1】:

没有分配内存@amdixon

// char* input;
#define N 1000
char* input = malloc(N);
do {
   ...
} while (strcmp(input, endof)!=0);
free(input);

fgets() 使用不当

do {
  // input=fgets(input, 20, stdin);
  if (fgets(input, N, stdin) == NULL) break;
   ...
} while (strcmp(input, endof)!=0);

可能是错误的endof 字符串。

// char* endof="***END***";
char* endof = "***END***\n";  // Add \n for `fgets()`

建议do while重写

while (fgets(input, N, stdin) != NULL) && strcmp(input, endof)!=0) {
   ...
}

【讨论】:

  • 嗨,首先,你能告诉我#define N 1000 是做什么的吗?我对C完全陌生,对不起。其次,我按照您的建议进行了所有更改,但仍然遇到与上次相同的错误。
  • #define N 1000 是一个预处理器宏。是进行文本替换,无论何时出现N,它本身都会被替换为1000
  • 在上次编辑中建议 1) 删除 if (fgets(input, N, stdin) == NULL) break; 2) 将 do { 替换为 while ((fgets(input, N, stdin) != NULL) &amp;&amp; (strcmp(input, endof)!=0)) { 3) 将 } while ((fgets(input, N, stdin) != NULL) &amp;&amp; (strcmp(input, endof)!=0)); 替换为 }。 4) 可能想在k++ 之后添加一个测试,比如if(k &gt;= 10) break;,以防止k 变得太大。 5) 我不知道strsep() 做了什么。 6) 可以在numExperiment++; 之后进行测试,以确保它不会 >= 20 7) 祝你好运。
【解决方案2】:
char* input;
input=fgets(input, 20, stdin);

您已经声明了input,但没有为其分配内存。

做任何一个

char input[20];

char * input;
input = malloc(20);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多