Pergunta

Mirar :Imprima o diretório de trabalho atual em c na máquina Linux.

Sem usar ponteiros, ele está fornecendo a saída correta.

#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;
}

Mas com o ponteiro mostra o seguinte erro

getcwd() error : : Numerical result out of range
Foi útil?

Solução

Isto porque quando buf é um ponteiro, sizeof(buf) é o número de bytes necessários para armazenar um ponteiro, não o tamanho do array, como no código que você comentou.

Você precisa passar o tamanho que você alocou (ou seja,1024) em vez disso, assim:

size_t allocSize = sizeof(char) * 1024;
buf = (char *)malloc(allocSize);
if((cwd = getcwd(buf, allocSize)) != NULL) ...

Outras dicas

sizeof(buf) retornará o tamanho de char* que terá quantos bits de largura o seu processador tiver (32 bits ou 64 bits).

O que você deseja é usar o número mágico com o qual você alocou, neste caso 1024.

Experimente isto:

#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;
}

char *getcwd(char *buf, size_t size);
Aqui você está dando o tamanho como sizeof(buf) que retornará o tamanho do buf ponteiro que dependerá da máquina.
Você deve especificar 1024 no argumento para getcwd.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top