[C] Malloc tworzy zbyt dużą tablicę.

0

Dlaczego poniższy kod wyświetla mi na ekranie 16 razy 'a', zamiast jeden raz? Co robię źle?

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

int main()
{
	int i;
	char *tab = (char*)malloc(sizeof(char));

	for(i = 0; i < strlen(tab); i++)
		tab[i] = 'a';

	printf("%s", tab);

	getchar();
} 
3

malloc nie zeruje pamięci, więc masz tam same śmieci. strlen zwraca złą wartość, bo liczy znaki aż do wystąpienia bajtu 0. Gdzieś najprawdopodobniej on wystąpi, ale na 99% nie w miejscu, w którym zaalokowałeś pamięć. I dalej nadpisujesz nie swoją pamięć, a printf wypisuje wszystkie znaki, aż do bajtu 0.

1

Sam mam wpisać w odpowiednim miejscu bajt 0?
na przykład, albo użyć calloc(), które zeruje alokowaną pamięć.

1
char *tab = (char*)malloc(sizeof(char));

Przecież alokujesz 1 znak - nie możesz tam trzymać null-terminated stringa.

Rozwiązanie:

#include <stdio.h>
#include <string.h>
#include <malloc.h>
 
int main()
{
        int i;
        char *tab = (char*)malloc(sizeof(char));
 
        *tab = 'a';
 
        printf("%c", *tab);
 
        free(tab);

        getchar();
} 

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