我正在尝试读取文件并将此文件拆分为多个缓冲区。 这就是我想出的:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define PKT_SIZE 2048;
#define PATH "directory of some kind"
int main() {
char filepath[200] = PATH;
FILE *packet;
int size = PKT_SIZE;
char *buffer[size];
int i=0;
//OPEN FILE
if((packet = fopen(filepath, "r")) == NULL){ //I'm trying with a txt file, then i'll change it to 'rb'
printf("Error Opening File\n");
return -1;
}
//READ FILE
while(*fgets((char *) *buffer[i], (int) strlen(buffer[i]), packet) != NULL) { //read the file and cycling insert the fgets into the buffer i
printf("Create %d buffer\n", i);
i++;
}
fclose(packet);
return 0;
}
现在,当我运行这个程序时,我收到一个SIGSEGV错误,我设法理解这个错误是肯定的:
*fgets((char *) *buffer[i], (int) strlen(buffer[i]), packet) != NULL
你有什么建议吗?
答案 0 :(得分:1)
*fgets((char *) *buffer[i], (int) strlen(buffer[i]), packet)
这一行有几个问题。
buffer[i]
只是一个未初始化的指针。*buffer[i]
类型为char
,您需要传递char*
。strlen
未返回缓冲区的大小。这是未定义的行为,因为你通过未初始化的指针值调用它。fgets
返回fgets
时,同时取消任何NULL
返回的内容都很糟糕。它调用未定义的行为。从动态内存分配到使用,有很多解决方案
char buffer[size][MAXSIZE];
。如果你这样做,你可以这样得到输入:
#define MAXSIZE 100
...
char buffer[size][MAXSIZE];
while(fgets(buffer[i], sizeof(buffer[i]), packet)!=NULL){...
答案 1 :(得分:0)
char* buffer[size]
是N char*
个指针的数组,未初始化。你必须在使用它们之前为它们分配内存,否则你的程序会在火球中爆炸。
修复是分配:
for (size_t i = 0; i < size; ++i) {
buffer[i] = malloc(PKT_SIZE);
}
你也要对未来的记忆负责,所以不要忘记free
以后。
分配任意数量的缓冲区非常浪费。通常最好使用某种简单的链表类型结构并根据需要附加块。这避免了无意义的内存过度分配。