0

我正在关注 C 的在线课程(链接),这是一段代码,里面有我的一些打印:

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 循环的某个地方犯了一个错误,但这无关紧要,我担心没有打印“开始 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”)。

4

1 回答 1

0

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

这意味着即使您看不到它的输出,问题也可能发生在 printf 之后。

为了避免这种情况,在所有没有终止换行符的 printf 语句之后放置一个 fflush(stdout) 。

于 2012-11-18T01:47:30.027 回答