C错误似乎突然出现了

时间:2012-11-18 01:14:06

标签: c segmentation-fault

我正在关注C(link)的在线课程,这是我的一些代码中的一部分:

void Database_create(struct Connection *conn, int max_rows, int max_data)
{
  printf("Database_create with max_rows = %d, max_data = %d\n",max_rows,max_data);
  int i = 0;

  printf("Starting for-loop\n");
  for(i = 0; i < max_rows; i++) {

    printf("i");
    struct Address addr = {.id = i, .set = 0};

    printf("a");
    conn->db->rows[i] = addr;
  }
  printf("Done!");
}

当我运行它时,调用上面的函数,这是输出:

toon@ToonAlfrinkPC ~/Projects/lcthw $ ./ex17 test.db c 200 513
Database_create with max_rows = 200, max_data = 513
Segmentation fault

现在,我确定我在for循环中的某个地方犯了一个错误,但这是无关紧要的,我担心“开始循环”没有被打印。这必须意味着错误介于这两个打印语句之间。

初始化i或调用printf会导致分段错误吗?如果不是,那空白呢?怎么可能呢?

注意:我没有忘记编译。

编辑:

为了让事情更加混乱,Database_create函数现在似乎没有任何调整就可以正常工作。

是否可以同时运行不同的功能?这是该计划的方式:

if(argc != 5) die(conn, "USAGE: ex17 <dbfile> create <max_rows> <max_data>");
Database_create(conn,atoi(argv[3]),atoi(argv[4]));
Database_write(conn);
break;

Database_write函数似乎导致错误,是否可能在Database_create完成之前抛出该错误?

编辑:

我说“没有任何调整”,但我确实在最后一条评论后写了一个换行符(“完成!\ n”)。

1 个答案:

答案 0 :(得分:0)

stdout通常是行缓冲的。因此,除非您打印的字符串是换行符,否则它将被缓冲并稍后显示,可能会在程序退出时延迟。

这意味着即使您没有看到输出,也可能在printf之后出现问题。

为了避免在没有终止的所有printf语句之后放置fflush(stdout) 换行符。