【问题标题】:C99 - Why can't I use a variable-length char array in Xcode 6?C99 - 为什么我不能在 Xcode 6 中使用可变长度字符数组?
【发布时间】:2015-01-22 17:05:04
【问题描述】:

在 Xcode 6 中获得了一个 C 命令行工具项目,除了一件小事之外,一切都很好:我一生都无法弄清楚如何为可变长度数组赋值!例如,考虑以下代码:

#include <string.h>
int main()
{
    int len = 10;
    char str[len];
    strcpy(str, "hello");
    printf("%s", str);
}

这编译得很好,但是当我调试它时,数组永远不会被分配!如果我在第 7 行设置断点,点击运行按钮并将鼠标悬停在 str 上,它只会显示该名称,旁边有一个箭头,展开后什么也没有!

如果我错了,请纠正我,但我相信这是我在这里编写的完全有效的 C99 代码......所以什么给出了?!我尝试了 GNU99 编译器(默认)和 C99 编译器,但均无济于事。

MTIA :-)

编辑:好的,我似乎对这里的一些人感到困惑,甚至可能是 PO (因为我在这个问题上至少获得了 3 票反对票)所以让我澄清一下。

我实际上是在 Mac OS X Yosemite 上编写一个 libcurl 应用程序,以通过 HTTP 将文件上传到 Web 服务器。最后,我希望能够在终端中输入“上传 [目标 URL] [文件或目录 1] [文件或目录 2] ... [文件或目录 N]”之类的内容,并让我的程序自动上传这些内容文件和目录到 [destination 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 中文件路径的最大长度是多少?等等,等等……所以我更愿意把它做成合适的尺寸。

如果您冒着这篇文章的极端篇幅来到这里,感谢您的耐心!我最初试图尽可能简洁地描述这个问题,但这显然只会引起混乱,所以我为此道歉:-)

【问题讨论】:

  • 看汇编输出,你的程序可以优化为printf("hello");
  • 你的意思是这段代码不打印任何东西?
  • 代码有效,我运行它,输出是:“你好”。最好在printf 函数中添加“\n”:printf("output: '%s'\n", test);
  • #include &lt;string.h&gt;了吗?
  • 哇你们这么快就回复了我没有机会纠正我明显的错误哈哈……我现在已经相应地编辑了我的问题。顺便说一句,这只是示例代码,我并没有真正尝试将“hello”打印到控制台 LOL ......我真正想做的事情要复杂得多,并且会占用 10 倍以上的空间和时间把它全部写出来......但是问题区域的要点在这里被捕获。

标签: c xcode variable-length-array


【解决方案1】:
int N;
scanf("%d",&N);

char a[N];

a 是一个 VLA。您的示例中显示的数组不是 VLA。

C99 支持 VLA。如果看不到输出试试

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

除此之外,您的代码看起来不错。

【讨论】:

  • 感谢您这么快回答,但请参阅我上面的评论 ;-)
  • 你有一个过时的答案。
  • @2501 是的,我应该删除它吗?
  • 它没有回答问题并且具有误导性。
【解决方案2】:

我最终对 OS X 中的最大路径长度进行了一些研究,遇到了this stackoverflow.com post,这让我想到了使用&lt;sys/syslimits.h&gt;PATH_MAX 定义。这是一个可接受的解决方案,因为该定义将始终在必要时更新。

【讨论】:

  • 这是一种变通方法,但不是您问题的答案,不是吗?
猜你喜欢
  • 2021-04-02
  • 2011-12-13
  • 2020-09-01
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
  • 2013-08-02
  • 2010-12-16
相关资源
最近更新 更多