如何将malloc内存用于字符串指针数组等问题

时间:2016-02-14 18:12:19

标签: c pointers

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);同样。

自学。请帮忙。

4 个答案:

答案 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;
}