Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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
如何为字符串指针数组分配malloc内存等问题 #包括 #包括 #包括 #定义最大线尺寸100 #定义初始缓冲区大小16 int main(){ 字符**行缓冲区; 行缓冲区=(字符**)malloc(初始缓冲区大小); int i=0; int行=0; //缓冲区的大小 int buffer_size=1; int*buffer\u size\u p=&buffer\u size; char*line\u one=(char*)malloc(最大行大小); //从文件中读取行 while(获取(第1行)){ 行缓冲区[行]=(字符*)malloc(最大行大小); strcpy(行缓冲区[行],行1); 行++; 行一=(字符*)malloc(最大行大小); //如果太多的行使缓冲区大小加倍 如果(行==*缓冲区大小){ 缓冲区大小*=2; line\u buffer=递增缓冲区(line\u buffer,buffer\u size\p); } } 打印行(行\缓冲区,行); //按strcmp对所有行进行排序 对于(i=0;i_C_Pointers - Fatal编程技术网

如何为字符串指针数组分配malloc内存等问题 #包括 #包括 #包括 #定义最大线尺寸100 #定义初始缓冲区大小16 int main(){ 字符**行缓冲区; 行缓冲区=(字符**)malloc(初始缓冲区大小); int i=0; int行=0; //缓冲区的大小 int buffer_size=1; int*buffer\u size\u p=&buffer\u size; char*line\u one=(char*)malloc(最大行大小); //从文件中读取行 while(获取(第1行)){ 行缓冲区[行]=(字符*)malloc(最大行大小); strcpy(行缓冲区[行],行1); 行++; 行一=(字符*)malloc(最大行大小); //如果太多的行使缓冲区大小加倍 如果(行==*缓冲区大小){ 缓冲区大小*=2; line\u buffer=递增缓冲区(line\u buffer,buffer\u size\p); } } 打印行(行\缓冲区,行); //按strcmp对所有行进行排序 对于(i=0;i

如何为字符串指针数组分配malloc内存等问题 #包括 #包括 #包括 #定义最大线尺寸100 #定义初始缓冲区大小16 int main(){ 字符**行缓冲区; 行缓冲区=(字符**)malloc(初始缓冲区大小); int i=0; int行=0; //缓冲区的大小 int buffer_size=1; int*buffer\u size\u p=&buffer\u size; char*line\u one=(char*)malloc(最大行大小); //从文件中读取行 while(获取(第1行)){ 行缓冲区[行]=(字符*)malloc(最大行大小); strcpy(行缓冲区[行],行1); 行++; 行一=(字符*)malloc(最大行大小); //如果太多的行使缓冲区大小加倍 如果(行==*缓冲区大小){ 缓冲区大小*=2; line\u buffer=递增缓冲区(line\u buffer,buffer\u size\p); } } 打印行(行\缓冲区,行); //按strcmp对所有行进行排序 对于(i=0;i,c,pointers,C,Pointers,首先,忽略get()函数,这是必需的 首先,我使用for循环来做(char*)line\u buffer[lines]=(char*)malloc(MAX\u line\u SIZE) 它不起作用 我是这样做的,但是,在从一个文件中读了几行之后,第一行变成了��R“,并且它每次都在变化 而且,我不能使用free(line_buffer);还有 自学。请提供帮助。一个大问题是,您只为行缓冲区分配16个字节,这意味着在64位系统上,您只为两个指针分配空间 如果您读取的行数超过两行(或32位系统中的四

首先,忽略get()函数,这是必需的

首先,我使用for循环来做(char*)line\u buffer[lines]=(char*)malloc(MAX\u line\u SIZE)

它不起作用


我是这样做的,但是,在从一个文件中读了几行之后,第一行变成了��R“,并且它每次都在变化

而且,我不能使用free(line_buffer);还有


自学。请提供帮助。

一个大问题是,您只为
行缓冲区
分配16个字节,这意味着在64位系统上,您只为两个指针分配空间

如果您读取的行数超过两行(或32位系统中的四行),您将超出范围

如果要为16个指针分配空间,则需要为
INITIAL\u BUFFER\u SIZE*sizeof(char*)
字节分配空间,或者更好的是,
INITIAL\u BUFFER\u SIZE*sizeof(*line\u BUFFER)


还有内存泄漏的问题,你有很多。首先,您不需要为临时缓冲区分配内存,将其声明为正常的固定大小数组。这将消除相当多的泄漏,因为您在循环中重新分配它,而不释放旧内存

然后要释放
line\u buffer
内存,实际上需要先释放每个条目,然后再调用
line\u buffer
上的
free

请记住:对于每个
malloc
,您都需要一个相应的
free

而不是显式地分配和复制每一行,虽然它不是一个标准的C函数,但几乎所有的库都有一个
strdup
函数为您执行此操作,因此您可以执行以下操作:

#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);
    int i = 0;
    int lines = 0;
    // the size of buffer
    int buffer_size = 1;
    int *buffer_size_p = &buffer_size;
    char *line_one = (char *) malloc(MAX_LINE_SIZE);
    //read lines from a file
    while (gets(line_one)) {
        line_buffer[lines] = (char *) malloc(MAX_LINE_SIZE);
        strcpy(line_buffer[lines], line_one);
        lines++;
        line_one = (char *) malloc(MAX_LINE_SIZE);
            // if too much lines double the buffer size
        if (lines == *buffer_size_p) {
            buffer_size *= 2;
            line_buffer = IncreaseBuffer(line_buffer, buffer_size_p);
        }
    }
    PrintLines(line_buffer, lines);
    // sorting all the line by strcmp
    for (i = 0; i < lines; i++) {
        printf("%s", line_buffer[i]);
//        int min = MinLineIndex(line_buffer, i, lines);
//        SwapLines(line_buffer, i, min);
    }


    PrintLines(line_buffer, lines);
//    free(line_buffer);
    return 0;
}
而且不需要
buffer\u size\p
变量,如果需要使用指向
buffer\u size
变量的指针,只需在需要时直接使用运算符的地址,如

line_buffer[lines] = strdup(line_one);

从您发布的内容来看,您的使用(或者说是不正确的)使用
malloc
可能是罪魁祸首

对于
行缓冲区
,您只分配了16个字节,而实际上您应该这样做:

line_buffer=(char**)malloc(初始_buffer_SIZE*sizeof(char*))

此外,我还鼓励您在其他
malloc
通话中使用
sizeof


line\u buffer[lines]=(char*)malloc(MAX\u line\u SIZE*sizeof(char))

下一个关键问题是:

line_buffer = IncreaseBuffer(line_buffer, &buffer_size);
应该是:

int buffer_size = 1;
毕竟,您只是将
初始缓冲区大小
指针分配给行。

(代表OP发布)

首先,忽略gets()函数,这是必需的:

int buffer_size = INITIAL_BUFFER_SIZE;
几乎所有的问题都是因为我不知道我需要使用
*sizeof(char*)

这是我的最终代码:

 (char **) malloc(INITIAL_BUFFER_SIZE * sizeof(char *))
#包括
#包括
#包括
#定义最大线尺寸100
#定义初始缓冲区大小16
int main(){
字符**行缓冲区;
行缓冲区=(字符**)malloc(初始缓冲区大小*大小)(字符*);
int i=0;
int行=0;

对于(i=0;i什么是
INITIAL\u BUFFER\u SIZE
?什么是
MAX\u LINE\u SIZE
?您的分配也比您需要的多得多,并且循环中存在非常严重的内存泄漏。您也不应该使用
get
,它自C99标准以来就已经过时,并且完全从最新的C11标准中删除。最后,(或其他返回
void*
)的函数。首先,忽略gets()函数,这是必需的。从文件中读取几行后,第一行类似于“��“在几行之后”…在一行之后调用
IncreaseBuffer
,我们对此一无所知。发布可编译代码,并包含一个重现问题的示例数据集。这是您不应该将字节大小硬编码到
malloc
calls.malloc的原因之一(INITIAL_BUFFER_SIZE*sizeof(char*))正因为如此,我做了很多愚蠢的工作来修复…….非常感谢“…您刚刚将INITIAL_BUFFER_SIZE指针分配给了行。”-不,他没有分配
INITIAL_BUFFER_SIZE
字节。是的,并且已经做出了注释,所以我说“下一个关键的事情”
sizeof(char)
在C规范中被定义为始终是
1
。是的,但这只是一个好习惯,绝对不会有什么坏处
#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;
}