我需要用系统编译程序,我有档案的名称,执行文件的名称,子执行gcc -o file.c exe1和父执行./exe1例如
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char *argv[])
{
if (argc != 3) {
printf("Debe ingresar el nombre del archivo a compilar y el ejecutable");
exit(1);
} else {
char *archivo1 = strcat("gcc ", argv[1]);
char *archivo2 = strcat(archivo1, ".c -o ");
char *archivo3 = strcat(archivo2, argv[2]);
char *ejecutable = strcat("./", argv[2]);
pid_t pid_hijo;
int valor;
switch(pid_hijo = fork()) {
case -1:
printf("No se pudo crear el hijo");
case 0:
valor = system(archivo3);
default:
wait(NULL);
valor = system(ejecutable);
}
}
return 0;
}
答案 0 :(得分:2)
此
char *archivo1=strcat("gcc ",argv[1]);
是未定义的行为。
在this error "gcc "
中是一个字符串文字并且只读,strcat()
会尝试写入它,实际上超出"gcc "
的结尾,尝试超出数组末尾写入也是未定义的行为,但在这种情况下,它不是一个数组,因此从任何角度来看它都是非法的。
您需要snprintf()
,就像这样
char command[200];
ssize_t result;
result = snprintf(command, sizeof(command), "gcc %s -o %s", argv[1], argv[2]) ;
if (result >= (ssize_t) sizeof(command))
error_cannot_store_the_command_in_command():