Sizeof - C

wedlled

Power Member
Fiz aqui um programazito para testar uns erros num projecto.

Por exemplo, neste código
codigo disse:
#include <stdio.h>
#include <string.h>

int grt(char* buff);

int main(){
printf("PROGRAMA DE TESTES\n");
int i;
char bla[6];
printf("Comaça aki\n");
for (i = 0; i < sizeof(bla); i++) {
bla = (char)i;
printf("Q %c ",bla);
}
printf("\n--> %d\n",sizeof(bla));
grt(bla);
return 0;
}

int grt (char *buff){
int i;
for (i = 0; i < sizeof(buff); i++) {
printf("Q %c ",buff);
}
char *temp;
printf("\nO tamanho é: %d\n",sizeof(buff));
memcpy(temp,buff,6);
printf("o tamanho é: %d\n",sizeof(temp));
return 0;
}

epá, o sizeof(buff) na função secundária não devia ser igaul ao sizeof(bla) do main?
A mim o sizeof(bla) dá-me certo - neste caso 6 - mas o do buff dá-me sempre 4.
Ele não devia ler directamente do que esta alocado naquela memoria do ponteiro?

thnks pela ajuda...
 
não... o buff é um ponteiro para caracter, e o bla é um vector de 6 caracteres... é normal que tenham tamanhos dferentes
o que tu deves querer é fazer o sizeof(*buff)... ou será &buff :S:S

whatever, o que tu queres é o sizeoff do elemento para o qual o ponteiro está a apontar, e não do proprio ponteiro, que é o que tu estas a fazer. assim o sizeof dá-e o tamanho de um nº hexadecimal, correpondente a um endereço de memoria.

acho que é isso...
 
Última edição:
Não deves usar o sizeof() para loops de arrays. Até porque o sizeof() não é uma função mas sim um comando do compilador que é executado em compile time.

O sizeof devolve 6 na primeira vez porque alocaste explícitamente bla com 6 posições de memória. Mas devolve 4 nas outras vezes porque o argumento da função é um char*, e qualquer apontador tem 4 bytes de memória.

A solução é usares mais um argumento na tua função, representando o tamanho do array.

Mais uma coisa, cuidado ao fazeres isto:
Código:
char *temp;
memcpy(temp,buff,6);
Não alocaste memória para tal, isto até causa um erro na execução, relativo à memória. Devias alocar memória para temp:
Código:
char *temp = malloc(6);
memcpy(temp,buff,6);
 
Yup, era esse o problema mesmo. Thnks. Já estou a debitar código à tempo de mais :P

@alph: ya, este programa foi mesmo so para exemplo. Os memcpy estão todos a apontar par uma entidade de uma estrutura que é iniciada (até estáticamente).

Já agora, alguem tem alguma reza que costume fazer ao chgar ao 100º Segmentation Fault? :002:
 
Última edição:
Back
Topo