1

我正在尝试将我的目录路径名放在一个字符串变量上,如下所示:

int main(int ac, char **av)
{
  char*dir;

  if(ac > 2)
    {
      dir = malloc(sizeof(*dir) * 512);
      getcwd(dir, sizeof(*dir));
      printf("dat dir is:\n");
      printf("%s\n", dir);
    }
}

我打印了一个空白,但是当我做这样的事情时

int main(int ac, char **av)
{
  char dir[512];

  if(ac > 2)
    {
      // dir = malloc(sizeof(dir) * 512);                                                                
      getcwd(dir, sizeof(dir));
      printf("dat dir is:\n");
      printf("%s\n", dir);
    }
}

它打印正确,为什么?我的第一个 malloc 不是应该让我的变量像 dir[512]

4

4 回答 4

3

getcwd(dir, sizeof(*dir))

sizeof产生 1 因为*dir指的是单个char。这不是你想要的。如果您将其替换为 512,则应该一切正常。

惯用的编码将是这样的:

int main(int ac, char **av)
{
  const int buf_size = 512;
  char *dir;

  if(ac > 2)
    {
      dir = malloc(buf_size);
      getcwd(dir, buf_size);
      printf("dat dir is:\n");
      printf("%s\n", dir);
    }
}

请注意,乘以sizeof(*dir)是无操作的,因为它总是返回 1。也就是说,malloc以 为单位进行分配char。所以我省略了无操作。

于 2014-03-25T01:15:32.217 回答
2

它与数组、指针和sizeof.

char dir[512];
sizeof(dir);

这是要求数组的大小,在本例中为sizeof(char) * 512-> 512

char *dir;
sizeof(dir);

这是要求指针的大小,在这种情况下是sizeof(char *)->48

char *dir;
sizeof(*dir);

这是一个奇怪的结构。我真的不舒服。因为dir还没有被初始化,所以任何取消引用dir都是值得关注的。但我认为编译器在这里解决了正确的问题,在这种情况下是sizeof(char)-> 1

在使用 if 指针时,您需要携带分配的大小。

char*dir;
if(ac > 2)
{
    dir = malloc(sizeof(char) * 512);
    getcwd(dir, sizeof(char) * 512);
    printf("dat dir is:\n");
    printf("%s\n", dir);
}

正确答案™有点复杂。

if (ac > 2)
{
    size_t size = 512;
    char *buf = malloc(size);
    char *dir = getcwd(buf, size);

    while (dir == NULL && errno == ERANGE)
    {
        size *= 2;
        buf = realloc(buf, size);
        dir = getcwd(buf, size);
    }

    printf("dat dir is:\n");
    printf("%s\n", dir);
    free(buf);
}

首先,我放弃sizeof(char)。在 C 中,sizeof(char)被定义为1,所以它是多余的。接下来,设置dir为的返回值getcwd(3)并保持数据缓冲区分开。一定要检查返回值,如果返回则getcwd(3)不够NULL大。在我的示例中,我将缓冲区的大小加倍,然后再试一次。最后,别忘了释放.errnoERANGEbufgetcwd(3)buf

我在这里没有做的事情是检查malloc(3)or的返回值realloc(3)。这是因为我觉得这个例子没有意义。如果我无法分配路径的大小,那么无论我做什么,我的程序都会崩溃。

于 2014-03-25T01:26:06.387 回答
0

如果您尽早将大小放入变量然后使用它,那么出错的事情就会更少:

    {
      常量 sizeof_dir = sizeof(*dir)*512;
      目录 = malloc(sizeof_dir);                                                                
      getcwd(目录,sizeof_dir);
      printf("dat 目录是:\n");
      printf("%s\n", 目录);
    }

杀死你的是getcwd(dir, sizeof(*dir)),sizeof 仍然是 1。

于 2014-03-25T01:23:19.543 回答
0

每当您动态分配内存时,请始终检查 calloc、malloca 和 realloc 的返回值,因为返回值表明内存分配成功与否。在这里,上述第一个答案很好,检查返回值总是有帮助的。

于 2014-03-25T12:54:35.797 回答