Получил проект инструмента командной строки C, идущий в Xcode 6, и все отлично работает, за исключением одной мелочи: я не могу на всю жизнь понять, как назначить значение массиву переменной длины! Например, рассмотрим следующий код:C99 - Почему я не могу использовать массив символов переменной длины в Xcode 6?
#include <string.h>
int main()
{
int len = 10;
char str[len];
strcpy(str, "hello");
printf("%s", str);
}
Это компилируется нормально, но когда я его отлаживаю, массив никогда не назначается! Если я установил точку останова в строке 7, нажмите кнопку запуска и наведите указатель мыши на str
, он просто отобразит это имя со стрелкой рядом с ним, которая при расширении не покажет ничего!
Исправьте меня, если я ошибаюсь, но я считаю, что это совершенно допустимый код C99, который я пишу здесь ... так что дает ?! Я пробовал как компилятор GNU99 (по умолчанию), так и компилятор C99, но безрезультатно.
MTIA :-)
EDIT: Хорошо, я, кажется, смущен и, возможно, даже PO'ed несколько людей здесь (так как я заработал по крайней мере 3 вниз голосов по данному вопросу), поэтому позвольте мне прояснить вещи немного.
Я фактически пишу приложение libcurl в Mac OS X Yosemite для загрузки файлов на веб-сервер через HTTP. В конце концов, я хочу написать что-то вроде «upload [destination url] [файл или каталог 1] [файл или каталог 2] ... [файл или каталог N]» в терминале, и моя программа автоматически загружает эти файлов и каталогов на [URL назначения]. Введенные пути могут быть относительно CWD или абсолютного.
Проблема существует в моей uploadDirectory
функции, как показано здесь:
void uploadDirectory(CURL* hnd, struct curl_httppost* post,
struct curl_httppost* postEnd, char* path, const char* url)
{
DIR* dir = opendir(path);
if (dir == NULL)
{
printf("\nopendir failed on path \"%s\"", path);
perror(NULL);
}
else
{
struct dirent* file;
while ((file = readdir(dir)) != NULL)
{
// skip the current directory and parent directory files
if (!strcmp(file->d_name, ".") ||
!strcmp(file->d_name, ".."))
continue;
if (file->d_type == DT_REG)
{
// file is an actual file; upload it
// this is the offending code
char filePath[strlen(path) + strlen(file->d_name) + 2];
strcpy(filePath, path);
strcat(filePath, "/");
strcat(filePath, file->d_name);
int res = uploadFile(hnd, post, postEnd, filePath, url);
printf("%d", res);
}
if (file->d_type == DT_DIR)
{
// file is a directory; recurse over it
// this section is omitted for brevity
}
}
closedir(dir);
}
}
Я знаю, что я мог бы определить filePath
с огромным постоянного размера, чтобы исправить эту проблему, но насколько велика слишком большой? Какова максимальная длина пути к файлу в OS X? Etc и т. Д., Поэтому я предпочел бы сделать его точно подходящим.
Если вы отважились на крайнюю длину этого поста и добрались досюда, спасибо за то, что вы так терпеливы! Первоначально я пытался описать проблему как сжато, как я мог, но это, очевидно, вызвало ничего, кроме путаницы, поэтому я прошу прощения за это :-)
Посмотрите на выход ассемблера, ваша программа может быть оптимизирована для 'printf (« hello »);'. – mch
Вы подразумеваете, что этот код ничего не печатает? – alk
Код работает, я запускал его, и выход был: «привет». Было бы лучше добавить «\ n» к функции 'printf':' printf ("output: '% s' \ n", test); ' – zaph