如何为字符串指针数组分配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
首先,忽略get()函数,这是必需的 首先,我使用for循环来做(char*)line\u buffer[lines]=(char*)malloc(MAX\u line\u SIZE) 它不起作用如何为字符串指针数组分配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位系统中的四
我是这样做的,但是,在从一个文件中读了几行之后,第一行变成了��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;
}