0

我是 C 的新手,目前正在从事一个项目,但我遇到了问题。

我有一个 int 数组,定义如下:

int* SwitchIDs = malloc(sizeof(int));
int* SeizeUTC = malloc(sizeof(int));
int* CorrelationIDs = malloc(sizeof(int));

我运行一个从数据库中检索值的查询,这些值如下所示

 SwitchID | CorrelationID | SeizeUTC   |
+----------+---------------+------------+
|    14356 |      10355062 | 1305534091 |
|    14356 |      10366006 | 1305536411 |
|    14354 |      12283158 | 1305537718 |

在数据库中, SwitchID 是 a mediumint(8) unsigned, CorrelationID 是 type int(10) unsigned, SeizeUTC 是 type int(10) unsigned

检索结果的查询会执行多次,因此返回的值不同,需要将这些值添加到每个数组中。

执行查询后,我得到返回的行数的值,然后我重新分配每个数组,如下所示,一旦重新分配,然后我尝试将数据库中的数据添加到每个数组中,如下所示。所有这一切也是在检查结果计数 > 0 之后完成的。下面是查询代码并将数据插入到数组中。

sqlLen = asprintf(&sql, "SELECT SwitchID, CorrelationID, SeizeUTC FROM TblCallLog "
                "USE INDEX(indCalled) WHERE SeizeUTC BETWEEN %lu AND %lu AND CalledNumberID='%i'"
                "AND Direction = 1 %s",
                DateToUTC(reportParameterArray[P_DATESTART], *(int*)&reportParameterArray[P_TIMESTART]), 
                DateToUTC(reportParameterArray[P_DATEEND], *(int*)&reportParameterArray[P_TIMEEND]),
                NumberIDs[i], reportRestrictions->PResultContraint);

 if ((mysql_real_query(HandleDB, sql, sqlLen))) return 1;
        resultReport = mysql_store_result(HandleDB);
        resultCount = mysql_num_rows(resultReport);
        printf("***Result Count: %i***\n", resultCount);
        if (resultCount != 0)
        {
                SwitchIDs = realloc(SwitchIDs, resultCount*sizeof(int));
                CorrelationIDs = realloc(CorrelationIDs, resultCount*sizeof(int));
                SeizeUTC = realloc(SeizeUTC, resultCount*sizeof(int)); 

    while((rowReport = mysql_fetch_row(resultReport)))
            {
                SwitchIDs[insertCount] = atoi(rowReport[0]);
                CorrelationIDs[insertCount] = atoi(rowReport[1]);
                SeizeUTC[insertCount] = atoi(rowReport[2]);
                            printf("SwitchID[%i]: %i\n", insertCount, SwitchIDs[insertCount]);
                printf("CorrelationIDs[%i]: %i\n", insertCount, CorrelationIDs[insertCount]);
                printf("SeizeUTC[%i]: %i\n\n", insertCount, SeizeUTC[insertCount]);
                insertCount++;
            }
}

这似乎适用于前 5 次插入,但是当它第 6 次循环时,它会因段错误而核心转储。

堆栈跟踪包含以下内容:

#0  0x400f24de in malloc_consolidate () from /lib/tls/libc.so.6
(gdb) bt
#0  0x400f24de in malloc_consolidate () from /lib/tls/libc.so.6
#1  0x00000038 in ?? ()
#2  0x401a88d8 in main_arena () from /lib/tls/libc.so.6
#3  0x080646c0 in ?? ()
#4  0x401a88c4 in main_arena () from /lib/tls/libc.so.6
#5  0x401a88a8 in main_arena () from /lib/tls/libc.so.6
#6  0x401a88a0 in __malloc_initialize_hook () from /lib/tls/libc.so.6
#7  0x401a7f0c in __elf_set___libc_thread_subfreeres_element___rpc_thread_destroy__ () from /lib/tls/libc.so.6
#8  0x401a88a0 in __malloc_initialize_hook () from /lib/tls/libc.so.6
#9  0xbfffeb04 in ?? ()
#10 0xbfffe474 in ?? ()
#11 0x400f4117 in _int_malloc () from /lib/tls/libc.so.6
Previous frame inner to this frame (corrupt stack?)

我猜这是因为 mysql 数据库是 mediumint 类型,但是当我重新分配时,我说的是 sizeof(int),所以它不足以容纳数字和崩溃。

我不确定如何解决这个问题,因为 C 没有任何 mediumint 的概念,至少,就我所知或能够找到的而言。

4

0 回答 0