用C语言分割故障堆芯问题

用C语言分割故障堆芯问题,c,C,我知道以前有人问过这个问题,我想我理解分段错误意味着我的指针不好。话虽如此,我还是非常感谢你能帮我找出我的错误所在。我有一个头文件和两个源文件,它们是 标题: #ifndef LINEHOLDER_H_INCLUDED #define LINEHOLDER_H_INCLUDED #define DEFAULT 100 #define MAXLEN 256 #define MAXLINES 1024 int readlines(char *lineptr[], int maxlines);

我知道以前有人问过这个问题,我想我理解分段错误意味着我的指针不好。话虽如此,我还是非常感谢你能帮我找出我的错误所在。我有一个头文件和两个源文件,它们是

标题:

#ifndef LINEHOLDER_H_INCLUDED
#define LINEHOLDER_H_INCLUDED



#define DEFAULT 100
#define MAXLEN 256
#define MAXLINES 1024
int readlines(char *lineptr[], int maxlines);
unsigned getline2(char *s, int size);
void printlines(char **lineptr, int size, int numlines);

#endif // LINEHOLDER_H_INCLUDED
第一个源文件是:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "lineholder.h"



int main(int argc, char *argv[])
{
  char *lineptr[MAXLEN];      /* input lines */
  int linecount = 0;
  int tail_count = 0;

   int i;

for (i = 1 ; i < argc ; ++i)
{
    char *arg = argv[i]; 
    if (strcmp(arg, "-n") == 0);
    {
        char *endptr;
        tail_count = strtol(arg, &endptr, 10);     
        if (*endptr == '\0')
            continue;
        fprintf(stderr, "warning , argument `%d' is not an integer\n", 1 + i);
     }
 }
  if (!tail_count)
    tail_count = 10;

  if ((linecount = readlines(lineptr,MAXLINES)) >= 0)
    printlines(lineptr, linecount,tail_count);

  return 0;
}
第二个源文件是:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "lineholder.h"

unsigned getline2(char *s, int size);

int readlines(char *lineptr[], int maxlines)
{ 
  int len, nlines;
  char *p, line[MAXLEN];

  nlines = 0;

  while ((len = getline2(line, MAXLEN)) > 0) {
    p = malloc(len);
    if (nlines >= maxlines || p == NULL) {
      return -1;
    } else {
      // line[len-1] = '\n';
      if ((len > 0) && line[len-1] == '\n') line[len-1] = '\n';
      strcpy(p,line);
      lineptr[nlines++] = p;
    }
  }
  return nlines;
}

void printlines(char **lineptr, int size, int numlines)
{
  /* 72 lines, we start on line 62 */
  int print_start;
  int line;

  print_start = size - numlines;
  for (line=print_start; line < size; line++)
    printf("%s", lineptr[line]);
}

unsigned getline2(char *s, int size)
{
  int i, c;

  for (i=0; i<size-1 && (c=getchar()) != EOF && c != '\n'; ++i)
    *s++ = c;
  if (c == '\n') {
    *s++ = c;
    ++i;
  }
  *s = '\0';

  return i;
}
在使用makefile构建它之后,我将得到一个名为tails的可执行文件 当我运行./tails test.out时,我收到分段错误。有人能帮我找出我在哪里分配内存,而我不应该这样做吗

谢谢


感谢你们的帮助,我更新了代码,但我的问题仍然存在

将指针递增两次,因为在strcmp*argv++,-n中再次递增指针,在第二种情况下,您可能会在strtol*argv,NULL,10中读取超出边界的内容

这是没有必要的

while (*++argv)
你可以用argc来做那件事

应该是

void printlines(char *lineptr[MAXLEN], int size, int numlines)

您将指针递增两次,因为在strcmp*argv++,-n中再次递增指针,在第二种情况下,您的读取可能超出strtol*argv,NULL,10中的界限

这是没有必要的

while (*++argv)
你可以用argc来做那件事

应该是

void printlines(char *lineptr[MAXLEN], int size, int numlines)

当应用程序试图访问其无权访问的内存时,会出现分段错误。在这种情况下,操作系统将生成SIGSEGV。这通常会终止应用程序并进行核心转储

默认情况下,内核转储被关闭或严格限制,以防止磁盘空间被填满

可以使用:ulimit-c unlimted轻松打开它们,这将允许创建大小不限的核心文件。核心文件通常在当前工作目录中创建

如果您使用-g debug symbol标志编译应用程序,现在可以通过运行以下命令找出问题所在:

gdb


要获取调用堆栈,请在gdb中键入bt命令。

当应用程序尝试访问其无权访问的内存时,会出现分段错误。在这种情况下,操作系统将生成SIGSEGV。这通常会终止应用程序并进行核心转储

默认情况下,内核转储被关闭或严格限制,以防止磁盘空间被填满

可以使用:ulimit-c unlimted轻松打开它们,这将允许创建大小不限的核心文件。核心文件通常在当前工作目录中创建

如果您使用-g debug symbol标志编译应用程序,现在可以通过运行以下命令找出问题所在:

gdb

要获取调用堆栈,请在gdb中键入bt命令。

在getline2读取最后一个“\n”后,下次调用它时可能会返回一个0,因为“\n”是文件中的最后一个字符

while ((len = getline2(line, MAXLEN)) > 0) {
  p = malloc(len);
  if (... || p == NULL) {
malloc0可能不会返回NULL,因此代码继续尝试第[-1]='\n'行;这是未定义的行为

    ...
    line[len-1] = '\n';
最后一行也不能以“\n”结尾,在这种情况下,行[len-1]=“\n”;砍掉一块有价值的炭。最好是防御性编码

    // line[len-1] = '\n';
    if ((len > 0) && line[len-1] == '\n') line[len-1] = '\n';
getline2读取最后一个“\n”后,下次调用它时可能会返回0,因为“\n”是文件中的最后一个字符

while ((len = getline2(line, MAXLEN)) > 0) {
  p = malloc(len);
  if (... || p == NULL) {
malloc0可能不会返回NULL,因此代码继续尝试第[-1]='\n'行;这是未定义的行为

    ...
    line[len-1] = '\n';
最后一行也不能以“\n”结尾,在这种情况下,行[len-1]=“\n”;砍掉一块有价值的炭。最好是防御性编码

    // line[len-1] = '\n';
    if ((len > 0) && line[len-1] == '\n') line[len-1] = '\n';

但是argv是以NULL结尾的。argv[argc]应始终为空。@JoachimPileborg是否始终为空?这不是只有在使用execl这样的函数来执行程序时才是正确的吗?那么argc有什么意义呢?根据5.1.2.2.1中的标准,argv[argc]应该是空指针。@GreatDane我现在正在读它,谢谢你指出这一点。我一直依赖于argc。删除它确实修复了我收到的警告,但我仍然得到分段错误,但argv是空终止的。argv[argc]应始终为空。@JoachimPileborg是否始终为空?这不是只有在使用execl这样的函数来执行程序时才是正确的吗?那么argc有什么意义呢?根据5.1.2.2.1中的标准,argv[argc]应该是空指针。@GreatDane我现在正在读它,谢谢你指出这一点。我一直依赖argc。删除它确实修复了我收到的警告,但我仍然收到分割错误。您可能存在内存泄漏。如果在readlines函数中,您读取一行,分配内存,然后表达式nlines>=maxlines为true,该怎么办?0 int tail\u count;应为int tail_count=0;1个字符*lineptr[MAXLEN],readlineslineptr,最大行大小不匹配。您可能存在内存泄漏。如果在readlines函数中,您读取一行,分配内存,然后表达式nlines>=maxlines为true,该怎么办?0 int tail\u count;应该是int tai
l_计数=0;1个字符*lineptr[MAXLEN],readlineslineptr,最大行大小不匹配。很好。这并不能解决我的问题,因为我仍然收到错误,但感谢您指出潜在的问题。我更新了上面的代码以反映这一点。这并不能解决我的问题,因为我仍然收到错误,但感谢您指出潜在的问题。我更新了上面的代码以反映这一点