Page 1 of 1

απορία με δείκτες σε C

Posted: Sun Oct 10, 2010 3:48 pm
by black7ack
Παιδιά γιατί το παρακάτω

Code: Select all

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


int f1(char **foo){
    char label[] = "Single";
    printf("%s\n", label);
    *foo = label;
    printf("%s\n", *foo);
    return 0;
}

int main()
{
    char *foo1 = NULL;
    f1(&foo1);
    printf("%s\n", foo1);
    return 0;
}
βγάζει έξοδο

Code: Select all

Single
Single

 
ενώ αυτό

Code: Select all

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


int f1(char **foo){
    char *label = "Single";
    printf("%s\n", label);
    *foo = label;
    printf("%s\n", *foo);
    return 0;
}

int main()
{
    char *foo1 = NULL;
    f1(&foo1);
    printf("%s\n", foo1);
    return 0;
}
βγάζει έξοδο

Code: Select all

Single
Single
Single
?

Re: απορία με δείκτες σε C

Posted: Sun Oct 10, 2010 4:06 pm
by gasparosoft
Ουσιαστικά το char label[] = "Single"; σου δημιουργεί ένα array από characters. Αυτό όμως βρίσκεται τοπικά στην συνάρτηση. Άρα μετά το return της συνάρτησης ο pointer δείχνει σε μια άκυρη θέση.
Το char *label = "Single"; ουσιαστικά δημιουργεί ένα block στην memory (και μάλιστα read only κιόλας) και ο pointer δείχνει σε αυτό. Δεν δημιουργείται τοπικά στην συνάρτηση , αλλά στο .rodata section , οπότε και μετά την επιστροφή της συνάρτησης ο pointer δείχνει στην έγκυρη θέση.

Για το 1ο:

Code: Select all

	.text
.globl f1
	.type	f1, @function
f1:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$40, %esp
	movl	$1735289171, -15(%ebp)
	movw	$25964, -11(%ebp)
	movb	$0, -9(%ebp)
	leal	-15(%ebp), %eax
	movl	%eax, (%esp)
	call	puts
	movl	8(%ebp), %eax
	leal	-15(%ebp), %edx
	movl	%edx, (%eax)
	movl	8(%ebp), %eax
	movl	(%eax), %eax
	movl	%eax, (%esp)
	call	puts
	movl	$0, %eax
	leave
	ret
	
Για το 2ο:

Code: Select all

	.section	.rodata
.LC0:
	.string	"Single"
	.text
.globl f1
	.type	f1, @function
f1:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$40, %esp
	movl	$.LC0, -12(%ebp)
	movl	-12(%ebp), %eax
	movl	%eax, (%esp)
	call	puts
	movl	8(%ebp), %eax
	movl	-12(%ebp), %edx
	movl	%edx, (%eax)
	movl	8(%ebp), %eax
	movl	(%eax), %eax
	movl	%eax, (%esp)
	call	puts
	movl	$0, %eax
	leave
	ret
	

Re: απορία με δείκτες σε C

Posted: Sun Oct 10, 2010 4:13 pm
by black7ack
Το υποψιαζόμουνα οτί αυτό συνέβαινε. Χίλια Ευχαριστώ. Να σε ρωτήσω κάτι ακόμα?
Το πρόγραμμα σε assembly πως μπορώ να το δω?

Re: απορία με δείκτες σε C

Posted: Sun Oct 10, 2010 4:19 pm
by gasparosoft
Αν χρησιμοποιείς gcc:

Code: Select all

gcc -S program.c
και σου εμφανίζει το program.s.

Αν χρησιμοποιείς windows (μέσα από visual c++ ή δεν ξέρω τι άλλο), τότε δεν έχω ιδέα :-p

Re: απορία με δείκτες σε C

Posted: Sun Oct 10, 2010 4:25 pm
by black7ack
Να σαι καλά!! Όσο να ναι πολύ μεγάλη βοήθεια να βλέπεις τι τρέχει τελικά στο pc σου.