簡體   English   中英

關於分配memory的問題: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 \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

編譯工作,但每當我運行程序本身時,它都會給我一個運行時錯誤,說:“分段錯誤(核心轉儲)”。 當我查看代碼本身時,我似乎沒有找到不屬於我的 memory,那么這個問題的解釋是什么,可以做些什么呢? 預先感謝您的幫助。

由於您說可執行文件名為“prnt1”並且源文件(您要從中讀取代碼)被命名為“prnt”,所以argv[0]具有可執行文件的名稱(即“prnt1”),並且當".c" 附加到argv[0]后,它變成了 "prnt1.c" - 這絕對不是您要讀取的文件; athen,由於該文件不存在,因此您遇到了分段錯誤。

因此,正如 Tom Karzes 所說,始終檢查fopen()的返回值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM