C错误被抛出似乎出乎意料

C错误被抛出似乎出乎意料,c,segmentation-fault,C,Segmentation Fault,我正在学习一门关于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

我正在学习一门关于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!");
}
现在,我确信我在for循环中的某个地方犯了一个错误,但这与此无关,我担心的是“开始for循环”没有被打印出来。这一定意味着错误在这两条打印语句之间

初始化i或调用printf是否导致分段错误?如果没有,空白是否存在?怎么可能呢

注意:我没有忘记编译

编辑:

更让人困惑的是,数据库创建功能现在似乎工作正常,没有任何调整

是否可以同时运行不同的功能?这就是程序的运行方式:

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;
if(argc!=5)die(conn,“用法:ex17创建”);
创建数据库(conn、atoi(argv[3])、atoi(argv[4]);
数据库写入(conn);
打破
Database_write函数似乎导致了错误,是否可能在Database_创建完成之前抛出该错误

编辑:


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

标准输出通常是行缓冲的。因此,除非您打印的字符串以换行符终止,否则它将被缓冲并在稍后显示,可能最晚在程序退出时显示

这意味着,即使没有看到printf的输出,问题也可能在printf之后发生

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

如果出现严重错误,
printf
可能在写入控制台后发生故障。这可能是由于代码中其他地方的错误造成的。所以。。(a)
conn
,(b)
con->db
,最后(c)
conn->db行>
的分配由什么决定?走出这些地方可能会破坏很多东西。你真的需要在gdb和/或valgrind下运行它。Antoine Mathys,你能在回答中重复一遍吗?我可以接受吗?有可能
conn->db->rows[i]
正在访问你的
rows
数组的无效索引吗?例如,
max_rows
的无效值可能会导致此SEGFULT。这很有趣,但如果您仅使用调试器来找出发生
SIGSEGV
的确切位置,则所有这些都将是毫无意义的。
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;