关于分配内存的问题:C [UBUNTU]

A question about allocating memory : C [UBUNTU]

我目前正在做一个练习,我必须创建一个程序,获取其中编写的所有代码,并在程序执行时将其输出到屏幕。

该练习表明我们可能会发现将来更改程序的文件名是合适的 - 并假设重命名是以协调的方式完成的,即源文件和执行文件被赋予相同的名称新名称(扩展名除外),程序应该可以正常运行,无需对源代码进行任何更改,也无需重新编译。

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 [=11=] */

   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

编译成功,但每当我 运行 程序本身时,它都会给我一个 运行 时间错误,说:“分段错误(核心转储)”。当我查看代码本身时,我似乎没有触及不属于我的记忆,那么对这个问题的解释是什么,对此可以做些什么呢?预先感谢您的帮助。

由于您说可执行文件名为“prnt1”并且源文件(您要从中读取代码)名为“prnt”,argv[0]具有可执行文件的名称(即“ prnt1") 并且,当“.c”附加到 argv[0] 时,它变成“prnt1.c”——这绝对是 而不是 您试图读取的文件从;那么,由于该文件不存在,您遇到了分段错误。

因此,正如 Tom Karzes 所说,始终检查 fopen() 的 return 值。