在 c 中分配数据的问题

An issue allocating data in c

我有这个作业,就是在 Linux 中执行 "tail" 命令,这是我目前所做的:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>

char *resize(char *data, int size)
{
    char *newData = malloc((size + 1) * sizeof(char));
    int counter;

    for(counter = 0; counter < size; counter++)
        newData[counter] = data[counter];
    return newData;
}

char *readStdIn(char *data)
{
    char buff, end = '\n';
    int rState, size = 1;
    data = malloc(size * sizeof(char));

    printf("%ld\n", sizeof(data));
    while ((rState = read(STDIN_FILENO, &buff, 1)) > 0)
    {
        if(rState < 0)
        {
            if(errno == EINTR) rState = 0;
            else
            {
                perror("read()");
                return 0;
            }
        }
        data = resize(data, size);
        data[size - 1] = buff;
        size++;
    }
    printf("%ld\n", sizeof(data));
    if(rState == 0) write(STDOUT_FILENO, &end, 1);
    return data;
}

int printLines(char *data)
{
    int lines = 0, position;// counter;
    for(position = sizeof(data) - 1; position > -1; position--);
        if (data[position] == '\n') lines++;
    return 0;
}


int main(int argc, char *argv[])
{
    char *data = 0;
    if(argc == 1)
    {
        readStdIn(data);
        if(data == 0) return 1;
        if(printLines(data) != 0) return 1;
    }
    return 0;
}

readStdIn()中,我应该把我在标准输入中读到的内容保存到char* data中,这样我就可以找到最后10行(或者发现有少于 10 行)的输入。问题是,当我调用 resize() 时,data 没有调整大小,而且我找不到原因。这很可能是 resize() 本身的问题,但我无法弄清楚。这个想法是 resize()data 的大小增加 1 个字符。 我希望我的解释足够彻底。

您的printf不正确。您正在打印指针的大小,这将是一个固定的数字,具体取决于您的体系结构。您应该直接打印尺寸。

printf("%d\n", size);

你的resize是正确的,只是你没有释放之前的内存,所以你有内存泄漏。您可以通过在 return.

之前添加 free() 来解决此问题
char *resize(char *data, int size)
{
    char *newData = malloc((size + 1) * sizeof(char));
    int counter;

    for(counter = 0; counter < size; counter++)
        newData[counter] = data[counter];
    free(data);
    return newData;
}