Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
分段错误。错误退出c程序_C_Pointers_Malloc - Fatal编程技术网

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

分段错误。错误退出c程序,c,pointers,malloc,C,Pointers,Malloc,我正在开发一个c程序,它连接到一个mysql数据库,从一个包含400万数据的表中读取数据,经过一些计算后将其数据写入另一个数据库中的另外100个表中。为了提高效率,我尝试使用100个线程为100个表写入数据,使用1个线程从数据库读取数据并将其写入缓冲区。这样100个线程就可以从缓冲区中读取数据 但问题是当我做缓冲的时候。我使用malloc来制作缓冲区字符***队列在头文件中声明,因此它是全局的 int i = 0, j = 0; queue = (char ***) malloc(100); i

我正在开发一个c程序,它连接到一个mysql数据库,从一个包含400万数据的表中读取数据,经过一些计算后将其数据写入另一个数据库中的另外100个表中。为了提高效率,我尝试使用100个线程为100个表写入数据,使用1个线程从数据库读取数据并将其写入缓冲区。这样100个线程就可以从缓冲区中读取数据

但问题是当我做缓冲的时候。我使用
malloc
来制作缓冲区<代码>字符***队列在头文件中声明,因此它是全局的

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);
    }
}
这就是我写入缓冲区的方式。正如我发现的,分割错误发生在这里


我需要100个缓冲区,每个缓冲区包含2000个180的字符串数组。这段代码编译成功。但运行时会出现分段错误。

据我所知,所有的
malloc()
调用都有问题

我们将以字节为单位的大小传递给
malloc()
malloc()
不知道要在其中存储返回指针的对象的大小。因此,它无法自动计算所需内存的总大小

我们需要计算所需的总大小,并将该大小传递给
malloc()

首先是

也就是说,假设
队列
定义为
字符***队列,我们需要

  • queue=malloc(100*sizeof*queue)
  • queue[i]=malloc(2000*sizeof(*queue[i])
如有需要,依此类推


最后,在使用返回的指针之前,始终通过
NULL
检查
malloc()。因此,为三星变量分配100个字节,这对于100个元素来说是不够的。与下一次调用
malloc
相同,它分配2000字节而不是2000个元素。

对我的声明的任何注释。我指的是我的方式。这是一个好的做法。不要努力成为一个。使用
for(i=0;i<100;i++)
即使您根据定义初始化
i
。事实上,
for(j;j<2000;j++)
在第一次迭代后将不起任何作用,因为您不会将
j
重置为
0
!。对(j=0;j<2000;j++)使用
。我做了更改,但没有更改。没用。结果是一样的。但无论如何,谢谢,我真的不知道,你能告诉我sprintf()的参数是否正确吗?我的意思是缓冲区元素是什么written@Laksith您传递的参数的内容是什么?请记住,您需要计算大小(例如180),将参数值放入包含空终止符的字符串中。你能检查并确认吗?表号是0-99的值。传递给缓冲区的字符串长度为150个字符
marker[]
是一个int数组,其中的元素从0到1999递增,因此在插入或删除值时可以递减递增
        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])++;