【发布时间】:2019-11-25 17:15:13
【问题描述】:
我有一个二进制文件,我以这种方式将数字存储为字符串:11 43 89 101 等
我想通过仅使用系统命令来读取存储的数字并将它们存储在字符串动态数组中,因为我不知道字符串最终会持续多久或多少。以下是相关代码:
char **positions;
int all_names=0,i,j;
fd=open(argv[2],O_RDWR|O_CREAT,S_IRWXU);
i=0;
j=0;
do{
positions=(char**)malloc(sizeof(char*));
(*positions)[i]=(char*)malloc((MAX_SIZE+1)*sizeof(char));
do{
read(fd,positions[i][j],1);
}while(positions[i][j+1]!='\0');
i++;
}while(i<all_names);
for(i=0; i<all_names; i++){
for(j=0; positions[i][j]!='\0';j++){
printf("%c", positions[i][j]);
}
printf("\n");
}
}
所有名称都会跟踪二进制文件中的条目数量。
当我运行它时,我遇到了分段错误。我存储数字的部分工作正常,我检查了文件。它总是存储数字和一个'\0'。
我收到此警告,但不知道如何解决
警告:不兼容的整数到指针转换将“char”传递给“void *”类型的参数 [-Wint-conversion] read(fd,positions[i][j],1);
关于positions[i][j]。
感谢您的帮助
编辑:将代码更改为:
char **positions;
int all_names=0,i,j;
positions=(char**)malloc(sizeof(char*));
*positions=(char*)malloc((MAX_SIZE+1)*sizeof(char));
fd=open(argv[2],O_RDWR|O_CREAT,S_IRWXU);
i=0;
j=0;
for(i=0; i<all_names; i++){
positions=(char**)realloc(*positions,(all_names) * sizeof(char*));
positions[i]=(char*)malloc((all_names+1)*sizeof(char));
for(j=0; ;j++){
read(fd,&positions[i][j],1);
if (positions[i][j] == ' ') {
break;
}
}
}
for(i=0; i<all_names; i++){
printf("%s\n", positions[i]);
}
}
现在我在运行时遇到错误:
malloc: * 对象 0x20400036 的错误:未分配重新分配的指针 * 在 malloc_error_break 中设置断点进行调试 中止陷阱:6
我真的认为我应该每次都重新分配,因为 all_names 值在我的代码的早期部分得到更新。我做错了什么?
【问题讨论】:
-
您似乎错过了分配内存来存储数据的重要步骤。
-
@RamblinRose 忘记在代码中显示了!编辑于。
-
我不明白第一个
for(j循环。在读取任何内容之前,您正在检查positions[i][j]的值。 -
你只为
positions[0]分配了内存,对于all_names字符串是不够的。 -
你不应该在循环中每次都分配
positions。
标签: c segmentation-fault binaryfiles dynamic-arrays