Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: asd 18. 01. 2013, 16:08:13
-
Caute. Mam takyto kod:
1 #include <stdio.h>
2 #include <ctype.h>
3
4 void strtoupper(char *str)
5 {
6 while (*str) // na znaku \0 sa cyklus zastavi
7 {
8 *str = toupper(*str); // dereferencuje aktualny znak na ktory ukazuje str, zavola toupper a nahradi tento znak
9 str++; // posunie ukazatel o 1
10 }
11 }
12
13 int main()
14 {
15 char *str = "hello world";
16 strtoupper(str);
17
18 printf("%s\n", str);
19
20 return 0;
21 }
a pada mi to hned pri prvom prechode cyklom:
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400571 in strtoupper (str=0x40066c "hello world") at case.c:8
8 *str = toupper(*str);
-
protoze
char *str = "hello world";
je read only
char str[] = "hello world";
bude ok
-
napriklad tady je k tomu nejaka diskuse
http://stackoverflow.com/questions/1704893/how-is-read-only-memory-implemented-in-c
-
char str[] = "hello world";
bude ok
Nebude. Je to uplne stejna chyba.
-
tomu nerozumim, proc?
char str[] = "hello world";
je snad uplne totez co
char str[12] = "hello world";
no a tohle uz mi snad prekladac nekde doprcic neda
-
char str[] = "hello world";
bude ok
Nebude. Je to uplne stejna chyba.
Ale bude, je rozdil mezi char * x a char x[]
pokud to chce resit pres char * x, musi nejdrive naalokovat pamet a pak to tam nakopirovat
-
Ale bude, je rozdil mezi char * x a char x[]
No mas pravdu, funguje to stejne jako = {'a','b',0}. To je az desivy, jak clovek rychle zapomina :(
-
mimochodem
int main() {
char str[] = "hello world";
puts(str);
return 0;
}
prelozi gcc jako
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
leal 20(%esp), %eax
movl %eax, (%esp)
movl $1819043176, 20(%esp)
movl $1870078063, 24(%esp)
movl $6581362, 28(%esp)
call puts
xorl %eax, %eax
leave
ret
takze tam skutecne vytvari na zasobniku lokalni promennou, a pak do ni cpe ten string
1819043176 = 0x6c6c6568 = "lleh"
1870078063 = 0x6f77206f = "ow o"
6581362 = 0x646c72 = "\0dlr"
takze toto proste musi fungovat, pokud to teda neni tak nejak platformove zavisle
-
prelozi gcc jako
Z toho, jak co gcc prelozi, bych asi radsi zadne zavery nevyvozoval :)
Ale kazdopadne jsi mel pravdu, standard to rika jasne: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf str. 144, example 8
Za zapomenuti takhle zakladni veci se asi dneska budu cervenat az do pulnoci :))
-
Dakujem vsetkym za odpovede/prispevky :)
-
no ja to gcc uvedl spis jako zajimavost, jak to pak vypada, kdyz uz jsem to zkousel
tak jsme si aspon trochu zopakovali C ;)