为什么我的程序返回(空)和乱码而不是预期的输出

时间:2018-09-25 05:28:06

标签: c memory-management malloc

Windows NT崩溃。 我是死亡蓝屏。 没有人听到你的尖叫声。

我正在编写一个程序,其中必须从文件中读取haikus,之后必须将所有五个音节行存储到一个数组中,并将所有七个音节行存储到另一个数组中。我必须使用char *指针数组来存储每组线。我也只能在每个指针上为字符串的实际长度分配足够的空间。结果,对于上面的haiku,我应该分别为这三行分别分配20、31和28个字节(包括\ 0)。 从文件中读取所有行并将其存储到适当的数组后,我必须使用随机数生成器来选择一组三行以打印到屏幕上。

#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时遇到的错误,但是我无法确切地知道我在做什么错误。我将非常感谢您提供的所有帮助!

2 个答案:

答案 0 :(得分:1)

svnsyllinesfivesyllines不会递增,因此您多次在索引0分配svnsylptrsfivesylptrs(泄漏)。即使您访问它,数组的其余部分也永远不会分配。

答案 1 :(得分:0)

这里有两个问题:

    数组svnsylptrsfivesylptrs
  1. 数组索引在相应的块中不增加。
  2. 数组svnsylptrs的大小为200。但是最后的for循环仅释放前100个元素。这将导致内存泄漏。

for (freearr = 0; freearr < 100; freearr++) //This should check upto 200 { free(svnsylptrs[freearr]); }