gpt4 book ai didi

c - 接收到的信号 SIGSEGV 出现段错误

转载 作者:太空宇宙 更新时间:2023-11-04 04:59:42 24 4
gpt4 key购买 nike

我正在研究 tail Unix 命令的实现,这是我目前的代码:

#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 = (char*) malloc((size + 1) * sizeof(char));
int counter;

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

int printLines(char *data, int size)
{
int lines = 0, position, counter;

for(position = size - 1; position > -1; position--)
{
if (data[position] == '\n') lines++;
if (lines == 10) break;
}

if (lines == 10)
for(counter = position; counter < size; counter++)
{
write(STDOUT_FILENO, &data[counter], 1);
}
else write(STDOUT_FILENO, data, size);
return 0;
}

int stdIn(char *data, int size)
{
char buff, end = '\n';
int rState = 0;

while ((rState = read(STDIN_FILENO, &buff, 1)) > 0)
{
if(rState < 0)
{
if(errno == EINTR) rState = 0;
else
{
perror("read()");
return 1;
}
}
data = resize(data, size);
data[size - 1] = buff;
size++;
}

if(rState == 0) write(STDOUT_FILENO, &end, 1);
return 0;
}

int tailRead(char *data, char *fileName)
{
int size = 1;
data = (char*)malloc(size * sizeof(char));

if(fileName == 0 || fileName == "-")
{
if(stdIn(data, size) > 0) return 1;
}
else
{

}

printLines(data, size);
return 0;
}


int main(int argc, char *argv[])
{
char *data = 0;
int counter;

if(argc == 1)
{
tailRead(data, 0);
if(data > 0) return 1;
}
else for (counter = 1; counter < argc; counter++)
{
tailRead(data, argv[counter]);
if(data > 0) return 1;
}

return 0;
}

问题是,在 resize() 函数的某处,我遇到了段错误,当我在 GDB 中运行该程序时,我遇到了 Program received signal SIGSEGV 段错误。调整大小 () 中的 0x00000000004006f7。这告诉我,我在 resize() 中遇到了某种内存分配问题,但到目前为止我一直无法找到该错误。我该怎么办?

最佳答案

int tailRead(char *data, char *fileName)
/* ... */

int main(int argc, char *argv[])
{
char *data = 0;
/* ... */
tailRead(data, 0);
}

您似乎期望,在main() 中,data 将指向在tailRead() 中分配的内存。事实并非如此。在 tailRead() 中,datamain() 中指针 data 的副本,您只需更改副本,不是原来的指针。原始指针仍指向 0

然后您使用空指针调用 resize(),这当然会导致分段违规。

解决方案

改为使用指向指针的指针,以修改原始指针。

int tailRead(char **data, char *fileName)
{
int size = 1;
*data = (char*)malloc(size * sizeof(char));

/* ... */
}


int main(int argc, char *argv[])
{
char *data = 0;
/* ... */
tailRead(&data, 0);
/* ... */
}

您对 stdIn() 也有同样的问题。它更改了 data,但没有反射(reflect) tailRead() 中调用站点的 data 指针的更改。您让 stdIn() 内存泄漏并继续使用悬垂指针。

关于c - 接收到的信号 SIGSEGV 出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34025670/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com