2016-09-27 2 views
0

Я делаю свою собственную версию make. Я допускаю, чтобы некоторые аргументы передавались через командную строку.Не печатать за пределами if statement

Я работаю над ним в кусках. Я устанавливаю FileName прямо сейчас

Я следующий код

int main(int argc, char *argv[]) { 
    char *fileName = NULL; 
    char fileFlag[2]; 

    strcpy(fileFlag, "-f"); 
    printf("%s\n", fileFlag); 
    if (argc == 1) { 
     fileName = (char *) malloc(sizeof("Makefile")); 
     strcpy(fileName, "Makefile"); 
     printf("One arg %s\n", fileName); 
    } 
    printf("\n%s", fileName); 
    return 0; 
} 

Когда он работает, я получаю следующий вывод.

-f 
One arg Makefile 

Нельзя ли напечатать еще одну строку?

+3

'fileFlag' недостаточно велик, чтобы содержать два символа и терминатор nul. – Riley

+0

Извините, не так ли было о 'sizeof (« Makefile »)' ... Удивительно, что он возвращает длину строки, включая терминатор. –

+0

Но мне интересно, почему строковый литерал будет интерпретироваться как массив в этом случае ... –

ответ

2

Первая проблема

strcpy(fileFlag, "-f"); 

fileFlag является одним из элементов не хватает необходимого пространства, вам необходимо иметь 3 элемент-массив для хранения "-f" вместе с нуль-терминатор. В этом случае, в соответствии с поведением strcpy(),

В strcpy функция копирует строку, указанную s2 (включая символ завершающего нулевого ) в массиве, на который указывает s1. [...]

Таким образом, включая нулевой символ, размер источника равен 3, поэтому это необходимо и для пункта назначения. В противном случае вы будете получать доступ к связанной из памяти, которая вызывает undefined behavior.

Это говорит,

+0

@EugeneSh. подождите, вы хотите сказать, что это не указатель на литерал? –

+0

На удивление, он возвращает длину строки. –

+0

@EugeneSh. Хорошо, это 'sizeof', который не вызывает распад. По определению строковые литералы являются _arrays типа char_, так что это It. –