strcpy и strcat иногда вызывают проблемы - PullRequest
1 голос
/ 31 августа 2011

привет, у меня есть код, подобный приведенному ниже

char *str ;

        strcpy(str, "\t<");
        strcat(str, time);
        strcat(str, ">[");
        strcat(str, user);
        strcat(str, "]");
        strcat(str, "(");
        strcat(str, baseName);
        strcat(str, ") $ ");

        printf("\String is now: %s\n", str);

Этот код кажется работающим, но когда я использую функцию анализа XCode, он говорит "Аргумент вызова функции является неинициализированным значением", а также иногда вызывает сбой моей программы ... когда я его удаляю, тогда он работает нормально ... Что не так? с этим? Спасибо

Ответы [ 3 ]

2 голосов
/ 31 августа 2011

strcpy и strcat используются для копирования и объединения строк в выделенный массив символов.

Поскольку str в не инициализированном виде, вы пишете в память, и это плохо, потому что вы повреждаете другие данные. В этот момент это может сработать, но рано или поздно ваша программа потерпит крах.

Вы должны выделить память при объявлении str:

char str[100];

Кроме того, strcat неэффективен, так как он должен искать конец строки, чтобы знать, где объединяются символы. Использование sprintf будет более эффективным:

sprintf(str, "\t<%s>[%s](%s) $ ", time, user, baseName);

Наконец, если вы не можете гарантировать, что сгенерированная строка будет соответствовать массиву, вам лучше использовать snsprintf.

2 голосов
/ 31 августа 2011

Вы не выделяете память и оставляете str неинициализированным. Все последующие записи выполняются через неинициализированный указатель, который указывает «куда-то» - это неопределенное поведение.

Вы должны выделить (и позже освободить) память, достаточно большую, чтобы вместить полученную строку:

char *str = malloc( computeResultSizeSomehow() );
if( str == 0 ) {
   // malloc failed - handle as fatal error
}

//proceed with your code, then

free( str );
1 голос
/ 31 августа 2011

Это намного проще и без ошибок из-за переполнения буфера:

#define BUFFERSIZE 512
char str[BUFFERSIZE];

snprintf(str, BUFFERSIZE, "\t<%s>[%s](%s) $ ", time, user, baseName);
...