Odniesie do adresu i wartosci wskaźnika

0
#include <stdio.h>
#include <stdlib.h>
main()
{
    float *tab, x;
    int size = 8, count = 0, i;
    tab = (float*)malloc(size * sizeof(float));
    printf("daj liczbe:\n");
    while (scanf("%f", &x) == 1) {
        if (count + 1 > size) {
            size *= 2;
            tab = (float*)realloc(tab, size * sizeof(float));
        }
        tab[count++] = x;

        for (i = 0; i < count; i++)
            printf("%f\n", tab[i]);
        free(tab);
    }
}

Program ma za zadanie rozszerzyć tablicę w momencie jak się zapełni, nie działa bo program się crashuje po osmiu liczbach+ nie rozumiem bo gdy mamy np.void *realloc(void p,size_t size) to ta gwiazdka przy realloc wskazuje że to jest odniesie do wartości czy adresu bo nie ogarniam jak to jest że tab = (float)malloc(size * sizeof(float)); ale przy definicji malloc jest void *malloc(size_t size) czyli dlaczego nie może być tab = (float)malloc(size * sizeof(float)); bo jak mam inny program ktory ma za zadanie skopiować tablicę

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char *strcopy(char *src){ int i=0;
    char *target;
    target=(char*)calloc(strlen(src),sizeof(char));
    if(target!=NULL)
    while((target[i]=src[i])!='\0')
        i++;
    return target;
    }


int main(){
    char *x="Hello World!";
    char *newarr=strcopy(x);
    printf(newarr);
    free(newarr);
}

to tam już jest char *newarr=strcopy(x); a nagłówek char *strcopy(char *src) ma gwiazdkę czyli chodzi o wpisanie wartosci do newarr nie rozumiem tego dlaczego tu jest newarr a tam tab = (float)malloc(size * sizeof(float)); moze powiedzcie co oznacza ta gwidka przy definicji jakiejkolwiek funkcji bo coś może źle rozumiem ;/

4

o_O
Gwiazdka ma różne znaczenie w zależności od kontekstu jej użycia.
Gwiazdka w deklaracji zmiennej oznacza "wskaźnik", wiec np. int* x oznacza x jest wskaźnikiem do zmiennej typu int.
Gwiazdka przy użyciu zmiennej oznacza dereferencje czyli odczytanie wartości spod wskaźnika, więc np. *x = 1 oznacza wpisz 1 do miejsca w pamięci na które pokazuje wskaźnik x.

Więc void *realloc(void *p,size_t size) oznacza że realloc zwraca wskaźnik oraz że pierwszym jego argumentem jest wskaźnik.

A program ci crashuje bo robisz W PĘTLI free na swojej tablicy więc ja ZWALNIASZ a potem wykonujesz sobie tab[count++] = x; jak gdyby nigdy nic ;]

2
  1. Zapoznaj się z inkrementacją bo jej nie rozumiesz: http://4programmers.net/Forum/1101404
  2. Problem masz z tym że zwalniasz tab po każdym kroku
char *strcopy(const char *src)
  {
   size_t size=strlen(src)+1;
   return (char*)memcpy(malloc(size),src,size);
  }
0

Gwiazdka ma różne znaczenie w zależności od kontekstu jej użycia.
Gwiazdka w deklaracji zmiennej oznacza "wskaźnik", wiec np. int* x oznacza x jest wskaźnikiem do zmiennej typu int.
Gwiazdka przy użyciu zmiennej oznacza dereferencje czyli odczytanie wartości spod wskaźnika, więc np. *x = 1 oznacza wpisz 1 do miejsca w pamięci na które pokazuje wskaźnik x.

Więc void *realloc(void *p,size_t size) oznacza że realloc zwraca wskaźnik oraz że pierwszym jego argumentem jest wskaźnik.

A program ci crashuje bo robisz W PĘTLI free na swojej tablicy więc ja ZWALNIASZ a potem wykonujesz sobie tab[count++] = x; jak gdyby nigdy nic ;]

 tab = (float*)realloc(tab, size * sizeof(float)); 

czy to oznacza ze podmieniam adres wyniku funkcji realloc do tab?

1

Tak. realloc zwraca nowy wskaźnik na powiększony blok

1

Albo mi się wydaje (nie lubię tego formatowania) albo zwalniasz w petli pamięć... więc "ciesz się", że wysypuje się dopiero po 8 przebiegach....

0
#include <stdio.h>
int main ()
{
int *a;

*a=5;

printf("%d",*a);
}
 

Dlaczego nie mogę zrobić czegoś takiego, bo mi wtedy wywala błąd?

4

Na co wskazuje a?

0

Ok, czyli a nie wskazywało na żadną komórkę pamięci i wiadomym było jedynie że jest to wskaźnik typu całkowitego

1 użytkowników online, w tym zalogowanych: 0, gości: 1