c - Malloc 不分配空间
问题描述
我正在尝试编写一个从文件动态读取输入的 C 程序。输入文件中的数据不在固定列中,它们用':'分隔。我正在从输入文件中读取每一行并传递给以下函数以基于“:”进行拆分,并返回一个字符串数组。定义 char **stringArray 将字符串列表返回给主程序。但是我的程序在下面的 malloc 步骤中停止,没有抛出任何错误。
有人能指出这个空间分配有什么问题吗?
char **splitString(char *inputString, char delim)
{
int cur_size=100,i=0;
char **stringArray;
printf("in splitstring, input read : %s\n",inputString);
if (NULL==(stringArray=(char **)malloc(cur_size*sizeof(char *)))){
fprintf(stderr,"%s","Error while allocating space while split string");
}
printf("%s\n","in splitstring, space allocated");
return stringArray;
}
输入文件 :
XX1701:x:11701:601:Name 1:/folder1/subfolder/subsubfolder1:/bin/bash
XX1702:x:11702:601:Name 2 Title:/folder1/subfolder/subsubfolder 2:/bin/bash
XX1703:x:11703:601:Name 3 Title 3:/folder1/subfolder/subsubfolder3:/bin/bash
程序的输出,我得到:
$ ./sortStudent
In main , input read : XX1701:x:11701:601:Name 1:/folder1/subfolder/subsubfolder1:/bin/bash
in splitstring, input read : XX1701:x:11701:601:Name 1:/folder1/subfolder/subsubfolder1:/bin/bash
$
主要的 :
int main(int argc,char *argv[])
{
char *inputLine, **inputSplit;
FILE *fptr;
char *filename = "studentInput.txt";
int allocated_size=100,i,j,rc=0;
if (NULL == (fptr= fopen(filename,"r"))){ // Opens file in read mode and checks file open error
fprintf(stderr,"\nError in opening file %s",filename);
return -1;
}
if (NULL==(inputLine=(char *)calloc(1000,sizeof(char)))){
fprintf(stderr,"%s\n","Error in calloc");
return -1;
}
while (NULL!=fptr){
rc=getInput(fptr, &inputLine, '\n');
if (-1==rc){
return -1;
}
if (1==rc){
break;
}
printf("In main , input read : %s\n",inputLine);
inputSplit = splitString(inputLine, ':');
printf("In main, input split : %s %s %s\n",inputSplit[0],inputSplit[2],inputSplit[4]);
return 0;
}
获取输入:
int getInput(FILE * filePointer, char **storeStr,char endChar)
{
int i=0,c,cur_size=1;
if(NULL==(*storeStr = (char *)malloc(cur_size*sizeof(char)))){
fprintf(stderr,"%s","Error in malloc inside getInput function");
return -1;
}
if (EOF==(c=fgetc(filePointer))){
return 1;
}
(*storeStr)[i]=c;
for (i=1;EOF!=(c=fgetc(filePointer)) && (c)!=endChar;i++){ // Read next character from input until end string is reached
if ((i+1) <= cur_size){
cur_size *=2;
if(NULL==(*storeStr = (char *)realloc(*storeStr,cur_size))){
fprintf(stderr,"%s","Error in realloc inside getInput function");
return -1;
}
}
(*storeStr)[i]=c;
}
(*((*storeStr)+i))='\0'; // Add null char to denote end of string
return 0;
}
解决方案
内存分配错误通常不会在错误发生时出现,而是在稍后的某个时间出现。这就是这里发生的事情。
在getInput
您执行此检查以查看是否需要扩展缓冲区:
if ((i+1) <= cur_size){
如其所写,仅当当前索引小于容量而不是更大时才扩展缓冲区。因此,在第一次迭代中,您写入超过分配内存的末尾。
你反而想要:
if ((i+1) >= cur_size){
此外,您没有设置 in 的成员,stringArray
因此splitString
您需要添加代码来填充这些成员。
推荐阅读
- .htaccess - .htaccess 301 重定向除主页外的所有页面
- c# - 用于多种访问模式的 dynamoDb 范围键设计
- javascript - 开玩笑 - 断言异步函数抛出测试失败
- java - Swing 组件如何考虑我的默认语言环境?
- php - 如何使用 Symfony 原则指定我需要应用迁移的架构?
- python - 不能通过 Atom 工作的返回语句
- html - 为什么我在使用仅月份选择器时也得到日期 [PrimeNG]
- python - 从数组中删除重复项并将值相加 Python
- javascript - 如何使用其他数组的内容制作新数组或数组?
- amazon-web-services - 如何使用邮递员获取 Amazon SNS 电子邮件通知的响应?