Печать текущего рабочего каталога в c с помощью указателей - PullRequest
1 голос
/ 14 марта 2012

Цель: напечатать текущий рабочий каталог в c на компьютере с Linux.

Без использования указателей выдает правильный вывод.

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
int main()
{
    //char buf[1024];

    char * buf;
    char * cwd;
    buf = (char *)malloc(sizeof(char) * 1024);

    if((cwd = getcwd(buf, sizeof(buf))) != NULL)
            printf("pwd : %s\n", cwd);
    else
            perror("getcwd() error : ");
    return 0;
}

Но с указателем это показывает следующую ошибку

getcwd() error : : Numerical result out of range

Ответы [ 3 ]

3 голосов
/ 14 марта 2012

Это потому, что когда buf является указателем, sizeof(buf) - это количество байтов, необходимое для хранения указателя , а не размер массива, как в коде, который вы закомментировали.

Вам нужно вместо этого передать указанный вами размер (т. Е. 1024), например:

size_t allocSize = sizeof(char) * 1024;
buf = (char *)malloc(allocSize);
if((cwd = getcwd(buf, allocSize)) != NULL) ...
1 голос
/ 14 марта 2012

char *getcwd(char *buf, size_t size);
Здесь вы задаете размер как sizeof(buf), который будет возвращать размер указателя buf, который будет зависеть от машины.
Вы должны указать 1024 в аргументе для getcwd.

1 голос
/ 14 марта 2012

sizeof(buf) вернет размер char*, который будет иметь столько же битов, сколько ваш процессор (32 или 64 бита).

То, что вы хотите, это использовать магическое число, с которым вы malloc'ed, в данном случае 1024.

Попробуйте это:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

int main()
{
    //char buf[1024];

    char * buf;
    char * cwd;
    buf = (char *)malloc(sizeof(char) * 1024);

    if((cwd = getcwd(buf, 1024)) != NULL)
            printf("pwd : %s\n", cwd);
    else
            perror("getcwd() error : ");
    return 0;
}
...