Deviceready has not fired after 5 seconds
Channel not fired: onCordovaInfoReady
Channel not fired: onCordovaConnectionReady
首先,忽略gets()函数,这是必需的。
首先,我使用for循环来做(char *)line_buffer [lines] =(char *)malloc(MAX_LINE_SIZE);
它不起作用;
我这样做了,但是,在从文件中读取了几行后,第一行变成了“ R”,并且每次都在变化。
并且,我不能使用free(line_buffer);同样。
自学。请帮忙。
答案 0 :(得分:1)
一个很大的问题是,您只为line_buffer
分配了16个 字节 ,这在64位系统上意味着您只为两个指针。
如果您读取两个以上(或32位系统上的四个)行,您将超出界限。
如果要为16个指针分配空间,则需要为INITIAL_BUFFER_SIZE * sizeof(char *)
字节分配空间,或者更好,INITIAL_BUFFER_SIZE * sizeof(*line_buffer)
。
然后是内存泄漏的问题,其中有很多内存泄漏。首先,您不需要为临时缓冲区line_one
分配内存,将其声明为普通的固定大小数组。当你在循环中重新分配它而不释放旧内存时,这将消除相当多的泄漏。
然后,在line_buffer
上致电free
之前,先释放实际需要释放每个条目的line_buffer
内存。
请记住:对于每个malloc
,您需要相应的free
。
而不是明确地分配和复制每一行,而不是标准的C函数,几乎所有的库都有一个strdup
函数为你做,所以你可以做例如
line_buffer[lines] = strdup(line_one);
如果您需要使用指向buffer_size_p
变量的指针,则不需要buffer_size
变量,只需在需要时直接使用address-of运算符,例如
line_buffer = IncreaseBuffer(line_buffer, &buffer_size);
答案 1 :(得分:0)
根据您发布的内容,使用malloc
可能是罪魁祸首。
对于line buffer
,你只需要分配16个字节,而实际上你应该这样做:
line_buffer = (char **) malloc(INITIAL_BUFFER_SIZE*sizeof(char*));
此外,我还鼓励在您的其他sizeof
电话中使用malloc
:
line_buffer[lines] = (char *) malloc(MAX_LINE_SIZE*sizeof(char))
答案 2 :(得分:0)
下一个至关重要的是:
int buffer_size = 1;
应该是:
int buffer_size = INITIAL_BUFFER_SIZE;
之后,你刚刚分配了INITIAL_BUFFER_SIZE
个指针。
答案 3 :(得分:-1)
(代表OP发布)。
首先,忽略gets()函数,这是必需的:
(char **) malloc(INITIAL_BUFFER_SIZE * sizeof(char *))
几乎所有问题都是因为我不知道我需要使用* sizeof(char *)
。
这是我的最终代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LINE_SIZE 100
#define INITIAL_BUFFER_SIZE 16
int main() {
char **line_buffer;
line_buffer = (char **) malloc(INITIAL_BUFFER_SIZE * sizeof(char *));
int i = 0;
int lines = 0;
for (i = 0; i<INITIAL_BUFFER_SIZE; i++){
line_buffer[i] = (char *) malloc(MAX_LINE_SIZE * sizeof(char));
}
// the size of buffer
int buffer_size = INITIAL_BUFFER_SIZE;
while (gets(line_buffer[lines++])) {
if (lines == buffer_size) {
buffer_size *= 2;
line_buffer = IncreaseBuffer(line_buffer, &buffer_size);
}
}
// sorting all the line by strcmp
for (i = 0; i < lines; i++) {
int min = MinLineIndex(line_buffer, i, lines - 2);
SwapLines(line_buffer, i, min);
}
PrintLines(line_buffer, lines - 1);
for (i = 0; i < buffer_size ; i++) {
free(line_buffer[i]);
}
free(line_buffer);
return 0;
}