gpt4 book ai didi

C 程序因段错误而崩溃,但在 LLDB 下工作得很好

转载 作者:行者123 更新时间:2023-11-30 16:49:07 26 4
gpt4 key购买 nike

我正在编写一个普通文件读取代码。

大部分看起来像这样。

首先是头文件file.h

// fheader.h
#ifndef __file_h__
#define __file_h__
// start from here
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void readFile(FILE *fr);

FILE* openFile(char *file_name);
#endif

主文件fmain.c

#include "fheader.h"


void readFile(FILE *fr) {
// Added Printf
printf("\n...\n");
printf("\n...\n");
printf("\n...\n");
printf("\n...\n");
char *buffer = calloc(sizeof(char),1);
while(!feof(fr)) {
fread(buffer,sizeof(char),1,fr);
printf("%s\n",buffer);
}
free(buffer);
return;
}


FILE* openFile(char *file_name) {
// printf("the file name that is going to be opened is %s",file_name);
FILE *fr;
fr = fopen(file_name,"r");
return fr;
}

int main(int argc,char *argv[]) {
if(argc < 2) {
printf("USAGE: ./file test.txt\n");
return 1;
}

if (argc > 2) {
printf("ERROR: Too many argument\n");
return 1;
}
FILE *fr;
char *file_name = calloc(strlen(argv[1]),sizeof(char));

strncpy(file_name,argv[1],strlen(argv[1]));
fr = openFile(file_name);
printf("\nReading from file\n");
readFile(fr);
fclose(fr);
free(file_name);
return 0;
}

我使用以下命令编译了代码

gcc -g3 -Wall fmain.c -o file.o

当我运行代码时

./file.o "~/workspaces/myWork/C_experiment/test.txt"

我看到段错误:11

但是当我在 lldb 中运行上述程序时,我工作并退出并返回代码 0

lldb ./file.o
(lldb) run "~/workspaces/myWork/C_experiment/test.txt"
// output of the file
Process 28806 exited with status = 0 (0x00000000)
(lldb) quit

现在,我不知道如何调试代码并找到 Seg Failure 原因。

最佳答案

您忘记在 file_name 末尾添加“\0”,并且当您执行 fread 读取 1 个字符时,您不会在缓冲区末尾添加“\0”。如果您只读取一个字符,则应该使用 char 而不是 1 的数组。

错误在这里:

 char *file_name = calloc(strlen(argv[1]),sizeof(char));
strncpy(file_name,argv[1],strlen(argv[1]));
fr = openFile(file_name);

您复制了 argv[1],但没有在末尾添加“\0”。那么 fopen 如何知道你的字符串在哪里停止呢?您应该向 calloc 添加 +1,并在 strncpy 之后添加 '\0',如下所示:

file_name[strlen(argv[1])] = '\0';

第二个错误在这里:

 char *buffer = calloc(sizeof(char),1);
while(!feof(fr)) {
fread(buffer,sizeof(char),1,fr);
printf("%s\n",buffer);
}

您将 1 分配给缓冲区并读取 1,没关系,但是当您将其发送到 printf 时,您没有在缓冲区中添加 '\0',那么 printf 如何知道在哪里停止?您应该调用 2 而不是 1,然后添加 buffer[1] = '\0';

通过这些修复:

#include "fheader.h"


void readFile(FILE *fr) {
char buffer;
while(!feof(fr)) {
fread(&buffer,sizeof(char),1,fr);
printf("%c\n",buffer);
}
return;
}


FILE* openFile(char *file_name) {
// printf("the file name that is going to be opened is %s",file_name);
FILE *fr;
fr = fopen(file_name,"r");
return fr;
}

int main(int argc,char *argv[]) {
if(argc < 2) {
printf("USAGE: ./file test.txt\n");
return 1;
}

if (argc > 2) {
printf("ERROR: Too many argument\n");
return 1;
}
FILE * fr = openFile(argv[1]);
printf("\nReading from file\n");
readFile(fr);
fclose(fr);
return 0;
}

关于C 程序因段错误而崩溃,但在 LLDB 下工作得很好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42721727/

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