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

Συζητήσεις για γλώσσες προγραμματισμού και θέματα σχετικά με προγραμματισμό.
Post Reply
black7ack
bit level
bit level
Posts: 15
Joined: Sat Apr 17, 2010 2:40 pm

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

Post by black7ack » Sun Oct 10, 2010 3:48 pm

Παιδιά γιατί το παρακάτω

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
?
User avatar
gasparosoft
Gbyte level
Gbyte level
Posts: 1920
Joined: Fri Oct 19, 2007 8:03 pm

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

Post by gasparosoft » Sun Oct 10, 2010 4:06 pm

Ουσιαστικά το 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
	
black7ack
bit level
bit level
Posts: 15
Joined: Sat Apr 17, 2010 2:40 pm

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

Post by black7ack » Sun Oct 10, 2010 4:13 pm

Το υποψιαζόμουνα οτί αυτό συνέβαινε. Χίλια Ευχαριστώ. Να σε ρωτήσω κάτι ακόμα?
Το πρόγραμμα σε assembly πως μπορώ να το δω?
User avatar
gasparosoft
Gbyte level
Gbyte level
Posts: 1920
Joined: Fri Oct 19, 2007 8:03 pm

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

Post by gasparosoft » Sun Oct 10, 2010 4:19 pm

Αν χρησιμοποιείς gcc:

Code: Select all

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

Αν χρησιμοποιείς windows (μέσα από visual c++ ή δεν ξέρω τι άλλο), τότε δεν έχω ιδέα :-p
black7ack
bit level
bit level
Posts: 15
Joined: Sat Apr 17, 2010 2:40 pm

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

Post by black7ack » Sun Oct 10, 2010 4:25 pm

Να σαι καλά!! Όσο να ναι πολύ μεγάλη βοήθεια να βλέπεις τι τρέχει τελικά στο pc σου.
Post Reply

Return to “Προγραμματισμός”