我正在关注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”)。
答案 0 :(得分:0)
stdout通常是行缓冲的。因此,除非您打印的字符串是换行符,否则它将被缓冲并稍后显示,可能会在程序退出时延迟。
这意味着即使您没有看到输出,也可能在printf之后出现问题。
为了避免在没有终止的所有printf语句之后放置fflush(stdout) 换行符。