Windows NT崩溃了。 我是蓝屏死机。 没有人听到你的尖叫声。
我正在编写一个程序,其中我必须从文件中读取俳句,之后我必须将所有五个音节行存储到一个数组中,将所有七个音节行存储到另一个数组中。我必须使用字符*指针数组来存储每组行。我也只能在每个指针上为字符串的实际长度分配足够的空间。因此,对于上面的俳句,我应该分别为这三行(包括 \0(使用 malloc 20、31 和 28 个字节。 从文件中读入所有行并存储到相应的数组后,我必须使用随机数生成器来选择一组三行打印到屏幕上。
#include <stdio.h>
#include <ctype.h>
#include <math.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main(int argc, char **argv)
{
if (argc != 2)
{
printf("This number of arguments is incorrect.");
return 1;
}
FILE *oldfile, *newfile;
char const *newfilename = "myhaiku.txt";
int linecntr = 0, fivesyllines = 0, svnsyllines = 0;
int freearr, newhaiku;
// char **fivesylptrs = malloc(200 * sizeof(char *));
// char **svnsylptrs = malloc(200 * sizeof(char *));
char *fivesylptrs[200], *svnsylptrs[100];
char line[129];
srand(time(NULL));
/* for (fivesyllines = 0; fivesyllines < 200; fivesyllines++)
{
fivesylptrs[fivesyllines] = (char *) malloc(129 * sizeof(char));
}
for (svnsyllines = 0; svnsyllines < 200; svnsyllines++)
{
svnsylptrs[svnsyllines] = (char *) malloc(129 * sizeof(char));
} */
oldfile = fopen(argv[1], "r");
newfile = fopen(newfilename, "w");
if (oldfile)
{
while (fgets(line, 129, oldfile) != NULL)
{
linecntr++;
if ((linecntr % 2) != 0)
{
// printf("%s", line);
fivesylptrs[fivesyllines] = (char *)malloc(129 * sizeof(char));
if (fivesylptrs[fivesyllines] == NULL)
{
printf("The memory for the five syllable strings wasn't allocated properly.n");
}
strcpy(fivesylptrs[fivesyllines], line);
// printf("%s", fivesylptrs[fivesyllines]);
fivesylptrs[fivesyllines] = fivesylptrs[fivesyllines + 1];
// fivesyllines++;
}
else if ((linecntr % 2) == 0 && line[0] != 'n')
{
// printf("%s", line);
svnsylptrs[svnsyllines] = (char *)malloc(129 * sizeof(char));
if (svnsylptrs[svnsyllines] == NULL)
{
printf("The memory for the seven syllable strings wasn't allocated properly.n");
}
strcpy(svnsylptrs[svnsyllines], line);
// printf("%s", svnsylptrs[svnsyllines]);
svnsylptrs[svnsyllines] = svnsylptrs[svnsyllines + 1];
// svnsyllines++;
}
}
}
else
{
printf("This file could not be opened, please try again.n");
}
for (newhaiku = 0; newhaiku < 10; newhaiku++)
{
printf("%s", fivesylptrs[(rand() % 200)]);
printf("%s", svnsylptrs[(rand() % 100)]);
printf("%s", fivesylptrs[(rand() % 200)]);
}
fclose(oldfile);
fclose(newfile);
for (freearr = 0; freearr < 200; freearr++)
{
free(fivesylptrs[freearr]);
}
for (freearr = 0; freearr < 100; freearr++)
{
free(svnsylptrs[freearr]);
}
return 0;
}
我已经尝试了许多不同的技术来解决我很确定我在 malloc 上遇到的错误,但我无法确切地弄清楚我做错了什么。我真的很感激任何和所有的帮助!
svnsyllines
和fivesyllines
不会递增,因此您可以在索引 0 处多次分配svnsylptrs
和fivesylptrs
(泄漏(。即使您访问阵列,也不会分配阵列的其余部分。
这里有两个问题:
数组svnsylptrs
和fivesylptrs
的数组索引在各自的块中不会递增。- 数组
svnsylptrs
的大小为 200。但是最后的for
循环只释放前 100 个元素。这将导致内存泄漏。
for (freearr = 0; freearr < 100; freearr++) //This should check upto 200
{
free(svnsylptrs[freearr]);
}