用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,最大行大小不匹配。很好。这并不能解决我的问题,因为我仍然收到错误,但感谢您指出潜在的问题。我更新了上面的代码以反映这一点。这并不能解决我的问题,因为我仍然收到错误,但感谢您指出潜在的问题。我更新了上面的代码以反映这一点