Ir para conteúdo
Fórum Script Brasil
  • 0

String como parâmetro de sizeof ()


Eric MGS

Pergunta

//Programa que imprime a memória utilizada por tipos de dados
#include <stdio.h>
  
void rotina (char texto[6]) {
    int tamanho = sizeof (texto);
    printf ("%s:\n",texto);
    printf ("Tamanho em bytes: %i\n\n",tamanho);
}

void main (void){
    rotina ("char");
    rotina ("int");
    rotina ("float");
}

Boa tarde,

Estou querendo fazer um programa que imprima a quantidade de memória em bytes que cada tipo de dados ocupa (porque em máquinas diferentes os valores podem ser diferentes).

Inicialmente escrevi o código apenas com a função main, repetindo o printf para cada tipo de dado, da seguinte forma:

...

   printf ("Tamanho em bytes: %i \n", sizeof (char);

   printf ("Tamanho em bytes: %i \n", sizeof (int);

...

Deu certo,

Porém depois decidi tentar usar uma outra função para não precisar repetir o printf e fiz da maneira em que coloquei o código aqui.

O retorno que o programa está dando é sempre 4 bytes, ou seja, o tamanho de char texto[6].

Já percebi que o problema é que em sizeof (texto) o valor que está sendo devolvido é o tamanho da variável texto,

mas gostaria que no lugar de texto fosse inserido o conteúdo da variável, ou seja, as strings "char", "int" , "float" , para que fosse retornado o tamanho de cada tipo de dado respectivo.

Tentei escrever no lugar de sizeof (texto) assim:

sizeof ("%s",texto);

Porém não deu certo.

Gostaria de saber se existe alguma maneira de que no parâmetro de sizeof fosse inserido o conteúdo da variável (string) e não a própria variável.

Agradeço se alguém souber responder.

 

 

Link para o comentário
Compartilhar em outros sites

13 respostass a esta questão

Posts Recomendados

  • 0

Como você mesmo falou, para saber o tamanho que ocupa basta fazer:

int tamanho = sizeof (char);

Para saber quanto tamanho ocupa é facil.... se você declarou char texto[6] é só multiplicar tamanho por 6(tamanho*6). Por outro lado se o que você quer é saber quantas letras tem num string é só usar strlen. Lá você pode ver um exemplo.

Link para o comentário
Compartilhar em outros sites

  • 0

Na verdade o que eu gostaria de saber não é  o tamanho de um tipo e nem o tamanho de um string.

Eu gostaria de saber se é possível fazer com a função sizeof o seguinte:

 

char texto[4] = "int";

sizeof (texto);

 

Onde em sizeof (texto) seria o mesmo que sizeof (int), porque o conteúdo de texto é "int"

Portanto com esse trecho de código eu gostaria de receber o valor do tamanho de int e não de char como acontece.

O que posso alterar? Sequencia de escape não deu certo.

Link para o comentário
Compartilhar em outros sites

  • 0

Entendo... porem he de dizer que isto não é possível, pois o sizeof vai lhe retornar, no main, o tamanho completo do vetor, porem em outras funções você vai obter somente o tamanho do ponteiro a char, teria de ser feito por você dita função, pois não existe, ou simplesmente ignoro sua existência.
 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>

void func( char* variavel ){

    if( stricmp ("char", variavel) == 0 ){
        printf("O tamanho do char é %d byte.\n", sizeof(char));

    }else if( stricmp ("int", variavel) == 0  ){
        printf("O tamanho do int é %d bytes.\n", sizeof(int));

    }else{
        printf("O tipo de dado não existe ou simplesmente não foi implementado ainda.\n");
    }//...


    return;
}

int main() {
    setlocale(LC_ALL, "");

    func("int");
    func("char");
    func("Banana");

    return 0;
}

 

Editado por vangodp
Link para o comentário
Compartilhar em outros sites

  • 0

Qual o uso que você quer dar para isso? As vezes pode não existir soluções devido a que o uso seria nulo pela maioria dos programadores, nesse caso deveria ser implementado pelo próprio programador, pense se realmente é necessário o que você quer, ou se é possível usar outras soluções.

Outro ponto é que em C você pode usar variaveis como int32 etc, isso garante que você terá 4 bytes em todo momento, 1 byte é igual a 8 bits, 8 bits multiplicados por 4 é igual a 32, por isso int32, é um inteiro de 32 bits, ou o que vem a ser o mesmo, int de 4 bytes. ;)

Link para o comentário
Compartilhar em outros sites

  • 0

É que estou fazendo um programa que mostra o tamanho de cada tipo de dados na máquina, porque li que em cada máquina pode ser diferente, logo seria somente pra verificação antes de começar a programar em uma máquina que não conheço.

E ele estava ficando muito grande:

///////////////////////////////////////////////////////////////////////////////////////
//                                TAMANHO DE TIPOS                                   //
//   Programa para saber a quantidade de memória ocupada por cada tipo de dados      //
//                                   Eric MGS                                        //
//                                   08_12_2017                                      //
///////////////////////////////////////////////////////////////////////////////////////

#include <stdio.h>
#include <math.h>

void main (void) {
    int tamanho,
        intervalo;

    //CHAR/SIGNED CHAR
    tamanho = sizeof (char);
    intervalo = (pow(2,8*tamanho)-1);
    printf ("CHAR/SIGNED CHAR:\n");
    printf ("Tamanho em bytes: %i\n",tamanho);
    printf ("Intervalo: -%i a %i\n\n",intervalo/2,intervalo/2);

    //UNSIGNED CHAR
    tamanho = sizeof (unsigned char);
    intervalo = (pow(2,8*tamanho)-1);
    printf ("UNSIGNED CHAR:\n");
    printf ("Tamanho em bytes: %i\n",tamanho);
    printf ("Intervalo: 0 a %i\n\n",intervalo);

    //SHORT/SHORT INT/SIGNED SHORT/SIGNED SHORT INT
    tamanho = sizeof (short);
    intervalo = (pow(2,8*tamanho)-1);
    printf ("SHORT/SHORT INT/SIGNED SHORT/SIGNED SHORT INT:\n");
    printf ("Tamanho em bytes: %i\n",tamanho);
    printf ("Intervalo: -%i a %i\n\n",intervalo/2,intervalo/2);

    //UNSIGNED SHORT/UNSIGNED SHORT INT
    tamanho = sizeof (unsigned short);
    intervalo = (pow(2,8*tamanho)-1);
    printf ("UNSIGNED SHORT/UNSIGNED SHORT INT:\n");
    printf ("Tamanho em bytes: %i\n",tamanho);
    printf ("Intervalo: 0 a %i\n\n",intervalo);

    //INT/SIGNED/SIGNED INT
    tamanho = sizeof (int);
    intervalo = (pow(2,8*tamanho)-1);
    printf ("INT/SIGNED/SIGNED INT:\n");
    printf ("Tamanho em bytes: %i\n",tamanho);
    printf ("Intervalo: -%i a %i\n\n",intervalo/2,intervalo/2);

    //UNSIGNED/UNSIGNED INT
    tamanho = sizeof (unsigned);
    intervalo = (pow(2,8*tamanho)-1);
    printf ("UNSIGNED/UNSIGNED INT:\n");
    printf ("Tamanho em bytes: %i\n",tamanho);
    printf ("Intervalo: 0 a %i\n\n",intervalo);

    //LONG/LONG INT/SIGNED LONG/SIGNED LONG INT
    tamanho = sizeof (long);
    intervalo = (pow(2,8*tamanho)-1);
    printf ("LONG/LONG INT/SIGNED LONG/SIGNED LONG INT:\n");
    printf ("Tamanho em bytes: %i\n",tamanho);
    printf ("Intervalo: -%i a %i\n\n",intervalo/2,intervalo/2);

    //UNSIGNED LONG/UNSIGNED LONG INT
    tamanho = sizeof (unsigned long);
    intervalo = (pow(2,8*tamanho)-1);
    printf ("UNSIGNED LONG/UNSIGNED LONG INT:\n");
    printf ("Tamanho em bytes: %i\n",tamanho);
    printf ("Intervalo: 0 a %i\n\n",intervalo);

    //LONG LONG/LONG LONG INT/SIGNED LONG LONG/SIGNED LONG LONG INT
    tamanho = sizeof (long long);
    intervalo = (pow(2,8*tamanho)-1);
    printf ("LONG LONG/LONG LONG INT/SIGNED LONG LONG/SIGNED LONG LONG INT:\n");
    printf ("Tamanho em bytes: %i\n",tamanho);
    printf ("Intervalo: -%i a %i\n\n",intervalo/2,intervalo/2);

     //UNSIGNED LONG LONG/UNSIGNED LONG LONG INT
    tamanho = sizeof (unsigned long long);
    intervalo = (pow(2,8*tamanho)-1);
    printf ("UNSIGNED LONG LONG/UNSIGNED LONG LONG INT:\n");
    printf ("Tamanho em bytes: %i\n",tamanho);
    printf ("Intervalo: 0 a %i\n\n",intervalo);



}

 

E ainda falta o float, double e long double, então queria saber se dava pra fazer dessa forma que perguntei para diminuir o tamanho, sem precisar repetir os blocos de cada tipo que tem o mesmo código, mudando apenas no sizeof .

Quanto ao int32, não sabia sobre isso, é só com o int que dá pra fazer isso?

Link para o comentário
Compartilhar em outros sites

  • 0

Desculpa discordar do que foi dito até então mas é possível sim passar uma String como parâmetro para a função sizeof(). Não só é possível como, em alguns casos, é necessário, tal como no exemplo abaixo q vou passar onde a String texto está sendo passada como parâmetro para a função sizeof() dentro da função strftime(). O código abaixo nada mais é do q um simples relógio.

Segue o código:

#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#include "windows.h"

typedef enum { False, True } bool;

int main()
{
	time_t agora;
	struct tm *tm_agora;
	char texto[100];

	system("title Clock");

	//system("mode con:cols=29 lines=6");

	while (True)
	{
		agora = time(NULL);
		tm_agora = localtime(&agora);
		strftime(texto, sizeof(texto), " %H:%M:%S \n\t%d/%m/%Y", tm_agora);
		printf("\n\n\t%s\n", texto);
		Sleep(1000);
		system("cls");
	} 

	return 0;
}

Como podemos ver no código passado, na linha:

strftime(texto, sizeof(texto), " %H:%M:%S \n\t%d/%m/%Y", tm_agora);

é passada a String texto como parâmetro da função sizeof(). Creio q em muitos outros casos isso se faz tbém necessário. Esse é um pequeno exemplo q prova q é possível sim fazer o q foi perguntado

Link para o comentário
Compartilhar em outros sites

  • 0
2 horas atrás, giu_d_ disse:

Desculpa discordar do que foi dito até então

Ta desculpado >_<. Mesmo porque se nota que você não leu minha resposta, ou de haver lido talvez não tenha entendido. Vou lhe refrescar a memória.
 

"Entendo... porem he de dizer que isto não é possível, pois o sizeof vai lhe retornar, no main, o tamanho completo do vetor, porem em outras funções você vai obter somente o tamanho do ponteiro a char, teria de ser feito por você dita função, pois não existe, ou simplesmente ignoro sua existência."

você está me dizendo a mesma coisa que eu falei.

Editado por vangodp
Link para o comentário
Compartilhar em outros sites

  • 0

Mesmo assim você não aportou nada novo ao tema.

Se você Conhece as boas praticas de programação, sabe que em algum momento de sua, esperamos que longa vida, ele irá dividir seu código em funções, por enquanto estiver usando o main como única função, tudo bem, isso eu já falei também, mas quando usar o sizeof em outra função vai dar erro. já provou usar o sizeof para memória alocada com malloc? É mais ou menos a mesma coisa. Sempre e quando você souber o que esta fazendo, muito bem, mas tenha claro que sizeof não sempre é a melhor solução.

Se você Conhece as boas praticas de programação, sabe que em algum momento de sua, esperamos que longa vida, ele irá dividir seu código em funções, por enquanto estiver usando o main como única função, tudo bem, isso eu já falei também, mas quando usar o sizeof em outra função vai dar erro. já provou usar o sizeof para memória alocada com malloc? É mais ou menos a mesma coisa. Sempre e quando você souber o que esta fazendo, muito bem, mas tenha claro que sizeof não sempre é a melhor solução.

Link para o comentário
Compartilhar em outros sites

  • 0

Hum... Tá certo. Se usar o sizeof() passando uma String em uma função que não a main() dá erro. Isso eu não sabia não e até mesmo não experimentei fazer. De qualquer modo longe de mim entrar em discussão sobre esse assunto. Tanto porque inda estou começando a estudar a linguagem C ( algo como 2 meses ) e sei q preciso amadurecer muito ainda. Isso é certo

Fiz um pequeno exercício e realmente deu diferença no resultado. Dá uma olhada e se puder roda o código:

#include <stdio.h>
#include <string.h>

void imprimir(char texto[])
{
	printf("ch tem %d bytes\n", sizeof(texto));
    printf("ch conta com %d caracteres\n", strlen(texto));
    strcpy(texto, "texto longo");
    printf("ch conta com %d caracteres\n", strlen(texto));
}

int main() {
    char ch[4];
    strcpy(ch, "abc");
    printf("ch tem %d bytes\n", sizeof(ch));
    printf("ch conta com %d caracteres\n", strlen(ch));
    strcpy(ch, "texto longo");
    printf("ch conta com %d caracteres\n", strlen(ch));
    
    printf("\n\nCom a funcao imprimir: \n\n");
    
    imprimir(ch);
}

Nesse exemplo no método main dá um resultado p a quantidade de bytes e usando a função dá um resultado diferente.

Creio q agora entendi o q você quis dizer

Fiz um pequeno exercício e realmente deu diferença no resultado. Dá uma olhada e se puder roda o código:

#include <stdio.h>
#include <string.h>

void imprimir(char texto[])
{
	printf("ch tem %d bytes\n", sizeof(texto));
    printf("ch conta com %d caracteres\n", strlen(texto));
    strcpy(texto, "texto longo");
    printf("ch conta com %d caracteres\n", strlen(texto));
}

int main() {
    char ch[4];
    strcpy(ch, "abc");
    printf("ch tem %d bytes\n", sizeof(ch));
    printf("ch conta com %d caracteres\n", strlen(ch));
    strcpy(ch, "texto longo");
    printf("ch conta com %d caracteres\n", strlen(ch));
    
    printf("\n\nCom a funcao imprimir: \n\n");
    
    imprimir(ch);
}

Nesse exemplo no método main dá um resultado p a quantidade de bytes e usando a função dá um resultado diferente.

Creio q agora entendi o q você quis dizer

Link para o comentário
Compartilhar em outros sites

  • 0

Criei um pequeno exercício usando o sizeof() dentro d uma função. É o mesmo relógio, só q dessa vez dentro de uma função externa

Segue o código:

#include "stdio.h"
#include "time.h"
#include "windows.h"

typedef enum {False, True} bool;

void mostrarRelogio(time_t agora)
{
	struct tm *tm_agora;
	char texto[50];
	while (True)
	{
		agora = time(NULL);
		tm_agora = localtime(&agora);
		strftime(texto, sizeof(texto), "%H:%M:%S", tm_agora);
		printf("\n\n\t%s\n\n", texto);
		Sleep(1000);
		system("cls");
	}
}


int main()
{
	char *c = NULL;
	time_t now;

	system("title Digital Clock");

	while (False)
	{
		time(&now);
		printf("\n\n\t%s\n\n", ctime(&now));
		Sleep(1000);
		system("cls");
	}

	mostrarRelogio(&now);
	
	scanf("%c", &c);

    return 0;
}

Continua funcionado normalmente o relógio. Então,  não sei mais o q dizer...

Link para o comentário
Compartilhar em outros sites

  • 0

Se fizer o que bem entender vai sair do seu jeito, mas se fizer como eu disse nunca irá lhe sair bem.
 

#include "stdio.h"


void foo( char frase[]){
    printf("Em foo: %d", sizeof(frase));
}


int main(){

    char frase [100];

    printf("Em main: %d", sizeof(frase));

    foo(frase);

    return 0;
}

Sei o que digo, não me questione.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...