分段故障。错误退出c程序

时间:2016-01-14 07:37:51

标签: c pointers malloc

我正在开发一个连接到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字符串数组。这段代码编译成功。但运行时它会产生分段错误。

2 个答案:

答案 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元素。