在 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;
}
我有这个作业,就是在 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;
}