以前上课时经常听老师说到数组地址越界的危险性,自己很少遇到这方面的问题,也没太在意。今天调程序遇到了一个问题,检查了n遍还是想不明白问题在哪儿,情况如下,
创建了3个数组:
char query[QUERY_BUF_LENGTH];
char query1[SUBQUERY_BUF_LENGTH];
char query2[SUBQUERY_BUF_LENGTH];
然后初始化数组query1,query2,并将这两个字符串连接组合赋给query:
memset(query1,'/0', SUBQUERY_BUF_LENGTH);
sprintf(query1,"SELECT reg_raster_metadata(%I64u,'%s',%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d); ", .....)
memset(query2,'/0', SUBQUERY_BUF_LENGTH);
sprintf(query2,"SELECT reg_raster_metadata(%I64u,'%s',%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d); ", .....)
memset(query,'/0', QUERY_BUF_LENGTH);
sprintf(query,"%s %s", query1, query2);
但结果是query的值不对,而且每次执行完query2的初始化后,query1的值都变了。但显然query1和query2是独立的,不可能会发生这种串联现象。
后来跟踪query2,发现它地址越界了,赋值的字符串比其数组长度要长。估计是写到了query1了,这样query的值自然会发生莫名奇妙的改变。
地址越界确实后果很严重,而且这类错误感觉也不太好找,应该是在写程序的时候就要注意到可能出现这个问题。