【发布时间】:2021-08-27 20:17:54
【问题描述】:
我目前正在做一个练习,我必须创建一个程序来获取其中写入的所有代码,并在程序执行时将其输出到屏幕上。
该练习表明我们可能会发现将来更改程序的文件名是合适的 - 并假设重命名是以协调的方式完成的,即源文件和执行文件被赋予相同的新名称(扩展除外),程序应该可以正常工作,不需要对源代码做任何改动,也不需要重新编译。
C 程序本身被称为 'prnt.c'-
我写了以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ENDFILEC ".c" /* extension */
int main(int argc, char *argv[])
{
FILE *filePointer;
int character;
char *fileNameToOpen;
fileNameToOpen = (char *)malloc(strlen(argv[0]) + 3); /* allocating memory for string + 3 for the extension - '.c' and \0 */
strcpy(fileNameToOpen, argv[0]);
strcat(fileNameToOpen , ENDFILEC); /* ending '.c' in the end */
filePointer = fopen(fileNameToOpen, "r");
while(!feof(filePointer))
{
character = fgetc(filePointer);
printf("%c" , character);
}
fclose(filePointer);
return 0;
}
我制作了一个“makefile”来编译程序,并且我制作了它以便将可执行文件称为“prnt1”。
基本上,如下所示:
prnt1 : prnt.c
gcc -ansi -Wall -pedantic prnt.c -o prnt1
编译成功了,但是每当我运行程序本身时,它都会给我一个运行时错误,说:“分段错误(核心转储)”。当我查看代码本身时,我似乎没有达到不属于我的记忆,那么该问题的解释是什么以及可以做些什么呢?提前感谢您的帮助。
【问题讨论】:
-
一个好的起点是添加您应该拥有的缺失错误检查。检查来自
malloc和fopen的返回值,并确保它们不是NULL。在寻求帮助之前,您确实应该至少做到这一点。最有可能的问题是fopen失败,但由于您不检查它,因此您会遇到 seg 错误。 -
另外,不要使用
feof。只需检查来自fgetc的返回值是否为EOF。
标签: c memory segmentation-fault