【问题标题】:A question about allocating memory : C [UBUNTU]关于分配内存的问题:C [UBUNTU]
【发布时间】: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

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

【问题讨论】:

  • 一个好的起点是添加您应该拥有的缺失错误检查。检查来自mallocfopen 的返回值,并确保它们不是NULL。在寻求帮助之前,您确实应该至少做到这一点。最有可能的问题是 fopen 失败,但由于您不检查它,因此您会遇到 seg 错误。
  • 另外,不要使用feof。只需检查来自fgetc 的返回值是否为EOF

标签: c memory segmentation-fault


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2010-12-10
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 2021-11-27
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多