Dynamiczne przydzielanie pamięci

0

Program nie chce mi nic zapisać do komórki fun->def w ostatniej funkcji
Gdy próbowałem podejrzeć ja w debugerze wyświela mi komunikat error: Cannot access memory at address 0x8
ale nie wiem dla czego. Mógł by mi ktoś to wytłumaczyć ?

static scont * tab[1000];
static int amont = 0;
static scont* ws = NULL;
static char*  temp = NULL;	

scont* spr(char * name){
	int i;
	
	for ( i = 0; i < amont; i++){
		if (!strcmp(name,tab[i]->name))
			return tab[i]; }
	scont * t = malloc( sizeof * t);
	t->name = strdup(name);
	t->def = NULL;
	t->prot = NULL;
	t->call = NULL;
	t->wywoluje = NULL;
	tab[i] = t;
	amont++;
	return tab[i];
}

void add(char * gdzie, char* co){
		if (gdzie == NULL){
			gdzie = strdup(co);
			return;}
			
		gdzie = realloc(gdzie, strlen(gdzie) + strlen(co) + 1);
		gdzie = strcat(gdzie,co);
}

char* wiersz( char* nazwaPliku, int numerLini){

	char tmp[500];
	int n;
	n = sprintf(tmp, "plik: %s od lini %d \n", nazwaPliku, numerLini);
	temp = realloc(temp,n+1);
	strcpy(temp,tmp);
	return temp;
	
}

void store_add_def (char* funkcja, int numerLini, char* nazwaPliku)
{	 

	scont * fun = spr(funkcja);
	add(fun->def, wiersz(nazwaPliku, numerLini);
	
	ws = fun;
}
	
0
typedef struct contener {
	char * name;
	char * def;
	char * prot;
	char * call;
	char * wywoluje;	
} scont;

Wydaje mi się że linijka która zacytowałeś jest poprawna, jeśli nie to proszę o jakieś wyjaśnienie.

Próbuje w niej za alokować pamięć o wielkości struktury scont odwołując się do niej przez wskaźnik t.

0
void add(char * gdzie, char* co){

gdzie jest kopią fun->def

0

Zgadza się ale fun->def jest wskaźnikiem wiec gdzie jest kopią tego wskaźnika i zmiany dokonywane są w tym samym bloku pamięci.
Mylę się ?

2

Właśnie dlatego wskaźniki są takie złe dla początkujących, bo strasznie mieszają w głowie.
fun->def to wskaźnik, czyli taka specjalna zmienna, ale nadal zmienna. Ta zmienna przed wywołaniem

add(fun->def, wiersz(nazwaPliku, numerLini);

ma wartość NULL, więc po wywołaniu nadal ma wartość NULL.

Żeby w pełni zrozumieć, weźmy inny przykład

void f(int* x) { *x = 6; }
int main() {
    int a = 2;
    int* addr = &a;
    f(addr);
    // tutaj a == 6
}

Przed wywołaniem f() zmienna a ma wartość 2, natomiast addr jakiś adres, powiedzmy 3333. Po wywołaniu addr nadal ma wartość 3333, za to dane pod adresem 3333 się zmieniły, więc a ma nową wartość. addr to jest to samo co fun->def w Twoim kodzie.

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