我正在开发一个连接到mysql数据库的c程序,从一个包含400万个数据的表中读取数据,并在计算完成后将其数据写入另一个数据库中的另外100个表中。为了提高效率,我尝试使用100个线程为100个表和1个线程写入数据,以从数据库中读取数据并将其写入缓冲区。这样100个线程就会从缓冲区读取。
但问题是我在制作缓冲区的时候。我使用malloc
来制作缓冲区。 char *** queue;
在头文件中声明,因此它是全局的
int i = 0, j = 0;
queue = (char ***) malloc(100);
int threadRet;
for (i; i < 100; i++) {
queue[i] = (char **) malloc(2000);
for (j; j < 2000; j++) {
queue[i][j] = (char *) malloc(180);
}
}
我之前提到的和我的缓冲区编写线程会清除函数void * thrededChunkPicker(void * parr)
sprintf(queue[tableNo][marker[tableNo]], "INSERT INTO usage_summary%s(mobile,`0`,ddate) VALUES('%s',%d,'%s') ON DUPLICATE KEY UPDATE `0` = VALUES(`0`), ddate=VALUES(ddate)", row[0] + 7, row[0], sumOfUsage, row[2]);
(marker[tableNo])++;
这是我写入缓冲区的方式。我发现分段错误发生在这里。
我需要100个缓冲区,每个缓冲区包含2000个180字符串数组。这段代码编译成功。但运行时它会产生分段错误。
答案 0 :(得分:7)
据我所知,您的所有malloc()
电话都存在问题。
我们将 bytes 中的大小传递给malloc()
。 malloc()
无法确定您将要存储返回指针的对象的大小。因此,它无法自动计算所需内存的总大小。
我们需要计算所需的总尺寸,并将该尺寸传递给malloc()
。
首先开始,please see this discussion on why not to cast the return value of malloc()
and family in C
.。
也就是说,假设queue
被定义为char *** queue;
,我们需要
queue = malloc(100 * sizeof*queue );
queue[i] = malloc(2000 * sizeof(*queue[i]) );
依此类推,如果需要的话。
最后,在使用返回指针之前,请务必通过malloc()
检查NULL
是否成功。
答案 1 :(得分:3)
最大的问题是malloc
分配了许多字节,而不是数组中的元素。因此,为三星变量分配100个字节,这对于100个元素来说空间不足。与下一次调用malloc
相同,它分配2000 字节而不是2000元素。