![](/img/trans.png)
[英]C question about allocating memory for a char* to be used with fread
[英]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.