gpt4 book ai didi

c - segmentation fault core dumped 问题与 C

转载 作者:太空宇宙 更新时间:2023-11-04 01:03:32 25 4
gpt4 key购买 nike

我知道之前有人问过这个问题,我想我明白有段错误意味着我在某处有一个错误的指针。话虽如此,我真的很感激帮助找出我的错误所在。我有一个头文件和两个源文件,它们是

标题:

#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 时,我收到了 segmentation fault core dumped 错误。任何人都可以帮我弄清楚我试图在我不应该分配内存的地方吗?

谢谢

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

最佳答案

您将指针递增两次,因为您在 strcmp(*argv++, "-n") 中再次递增它,在第二种情况下,您可能在 strtol( *argv, NULL, 10).

while (*++argv) { /* First time you increment the pointer */
if (strcmp(*argv++,"-n") == 0); /* You do it again */
/* If *++argv was `NULL' you went after it anyway
* so this is undefined behavior
*/
tail_count = strtol(*argv, NULL, 10);

这不是必须的

while (*++argv)

你可以为此使用argc

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);
}
}

main() 中的argc 参数包含传递给程序的命令行参数的数量,当然也包括 argv[0]这是程序本身的名称。

此外,接收 lineptr 的函数的签名是错误的

void printlines(char **lineptr, int size, int numlines)

应该是

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

关于c - segmentation fault core dumped 问题与 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29749482/

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