Ainda dúvida com ponteiro!

1. Ainda dúvida com ponteiro!

Apprentice X
ApprenticeX

(usa FreeBSD)

Enviado em 24/01/2023 - 20:33h

Boa noite a todos

Montei o exemplo abaixo, para mostrar o erro que está apresentado, e pra saber se é possível fazer o que explico no último exemplo.

Abaixo tenho uma função usando o sprintf:
Ocorre que não quero usar PATH_MAX, pois ele tem limite e isso quebraria o programa se o caminho de um arquivo exceder esse limite!
char DirectorySearch[PATH_MAX];
sprintf(DirectorySearch, "%s/%s", DirectoryPath, FileName->d_name);

Consegui fazer somente assim, ou seja, definindo o tamanho do meu ponteiro:
Mas quero saber se essa é a única forma, e ainda tenho dúvida no comentário do programa abaixo!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
const char Text1[] = "Bom dia";
const char Text2[] = "Viva o Linux";

// É necessário eu dar o espaço do character finalizador \0 ???
// 2 = vírgula e espaço | 1 seria o character finalizador
char *Ponteiro = malloc(strlen(Text1) + strlen(Text2) +2 +1); // Não coloquei 3 pra entenderem minha dúvida sobre o \0

sprintf(Ponteiro, "%s, %s", Text1, Text2);
puts(Ponteiro);
free(Ponteiro);
}

Montei o exemplo abaixo pra mostrar o que está ocorrendo. Da forma que gostaria de fazer se for possível
#include <stdio.h>

int main(void) {
// Usar const ou não aqui não muda os erros abaixo
const char Text1[] = "Bom dia";
const char Text2[] = "Viva o Linux";

// O compilador não aceita declarar assim!
//char *Ponteiro; // error: ‘Ponteiro’ is used uninitialized [-Werror=uninitialized]

// Se inicializo o ponteiro como Nulo, sprintf não aceita!
//char *Ponteiro = NULL; // Esse erro dá no sprintf error: argument 1 null where non-null expected [-Werror=nonnull]

// Tentei
// sprintf(*Ponteiro, "%s, %s", Text1, Text2); // error: passing argument 1 of ‘sprintf’ makes pointer from integer without a cast [-Wint-conversion]

// Talvez exista alguma conversão que não conheço que permita que o ponteiro funcione com sprintf?
// OBS não quero usar [b]asprintf[b] pois já conheço ela!
sprintf(Ponteiro, "%s, %s", Text1, Text2);

puts(Ponteiro);
}



  


2. Re: Ainda dúvida com ponteiro!

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 24/01/2023 - 20:34h

R: O erro que está apresentado é que a variável Ponteiro não foi inicializada. Quando você se refere a um ponteiro não inicializado, o compilador gera um erro, pois o endereço de memória não é conhecido.

Portanto, primeiro você precisa alocar memória para a variável Ponteiro e inicializá-la com o endereço de memória alocado. Depois disso, é possível usar a função sprintf(). Você pode usar malloc() para alocar memória para essa variável e strlen() para calcular o tamanho da variável. Você também precisa adicionar 1 ao tamanho da variável para o caractere de finalizador \0.


char *Ponteiro = (char *) malloc(strlen(Text1) + strlen(Text2) + 2 + 1);
sprintf(Ponteiro, "%s, %s", Text1, Text2);


Com isso, a variável Ponteiro pode ser usada com a função sprintf() para conseguir o que você procura.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts