2015-01-22 1 views
-1

Получил проект инструмента командной строки 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 и т. Д., Поэтому я предпочел бы сделать его точно подходящим.

Если вы отважились на крайнюю длину этого поста и добрались досюда, спасибо за то, что вы так терпеливы! Первоначально я пытался описать проблему как сжато, как я мог, но это, очевидно, вызвало ничего, кроме путаницы, поэтому я прошу прощения за это :-)

+2

Посмотрите на выход ассемблера, ваша программа может быть оптимизирована для 'printf (« hello »);'. – mch

+0

Вы подразумеваете, что этот код ничего не печатает? – alk

+0

Код работает, я запускал его, и выход был: «привет». Было бы лучше добавить «\ n» к функции 'printf':' printf ("output: '% s' \ n", test); ' – zaph

ответ

1
int N; 
scanf("%d",&N); 

char a[N]; 

a является VLA. Массив, показанный в вашем примере, не является VLA.

VLA поддерживаются на C99. Если вы не можете увидеть результат, попробуйте

printf("%s\n", test); 

Помимо этого, ваш код выглядит хорошо.

+0

Спасибо, что ответили так быстро, но см. Мой комментарий выше ;-) – Kenny83

+0

У вас есть устаревший ответ. – 2501

+0

@ 2501 Да, я должен удалить его? – Gopi

1

Я закончил исследование некоторых максимальных длин пути в OS X и столкнулся с this stackoverflow.com post, который дал мне идею использовать <sys/syslimits.h>PATH_MAX define. Это приемлемое решение, поскольку этот параметр всегда будет обновляться по мере необходимости.

+0

Это работа вокруг, но не ответ на ваш вопрос, не так ли? – alk

Смежные вопросы