关于分配内存的问题: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 值。
我目前正在做一个练习,我必须创建一个程序,获取其中编写的所有代码,并在程序执行时将其输出到屏幕。
该练习表明我们可能会发现将来更改程序的文件名是合适的 - 并假设重命名是以协调的方式完成的,即源文件和执行文件被赋予相同的名称新名称(扩展名除外),程序应该可以正常运行,无需对源代码进行任何更改,也无需重新编译。
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 值。