Я пытаюсь самостоятельно изучить C, используя C Primer Plus от Стивена Прата, и одно из упражнений в конце главы - «Написать функцию, которая заменяет содержимое строки настрока перевернута.Это глава о символьных строках с хорошей дозой указателей.Я пытаюсь использовать указатели как можно больше, чтобы лучше понять, но я застрял.
Моя проблема в том, что когда я печатаю значение указателя возврата в main, он искажается.
Когда я использую GDB (просто учусь, как использовать это тоже), я вижу, что адрес памяти, возвращаемый из моей функции, является тем же адресом, который использовался в функции, и он назначается моему указателю в main все в порядке.насколько я могу судить.
Я столько всего перепробовал, чего мне не хватает?FWIW Я еще не узнал о malloc в книге, хотя я вижу, что он упоминается на различных страницах www, которые я часто посещал, пытаясь лучше понять C.
<code>
$ cc -o exercise8 exercise8.c && ./exercise8
This is s1 before: abcd
This is s2 in function: dcba
This is s3 after: d`!
/* A function that replaces the contents of a string with the string reversed. */
#include <stdio.h>
#include <string.h>
char *str_rev(char * string);
int main(void)
{
char * s1 = "abcd";
char * s3;
printf("This is s1 before: %s\n", s1);
s3 = str_rev(s1);
printf("This is s3 after: %s\n", s3);
}
char *str_rev(char * string)
{
char ar3[5];
char * s2;
int len = 0;
s2 = ar3;
len = (strlen(string) - 1);
string = string + len;
while ( len >= 0 )
{
*s2 = *string;
len--;
string--;
s2++;
}
s2++;
*s2 = 0;
s2 = s2 - 5;
printf("This is s2 in function: %s\n", s2);
return s2;
}
$ gdb exercise8
GNU gdb (GDB) 7.1-ubuntu
Reading symbols from exercise8...done.
(gdb) break 12
Breakpoint 1 at 0x804844a: file exercise8.c, line 12.
(gdb) break 40
Breakpoint 2 at 0x80484d9: file exercise8.c, line 40.
(gdb) run
Starting program: exercise8
This is s1 before: abcd // My original string.
This is s2 in function: dcba // Good, my reversed string while in the function.
Breakpoint 2, str_rev (string=0xbffff043 "dcba") at exercise8.c:40
40 return s2;
(gdb) print s2
$1 = 0xbffff043 "dcba" // Location of pointer s2.
(gdb) continue
Continuing.
Breakpoint 1, main () at exercise8.c:12
12 printf("This is s3 after: %s\n", s3);
(gdb) print s3
$2 = 0xbffff043 "dcba" // Back in main same pointer as s2 from function.
(gdb) step
This is s3 after: d`Q // Line 12 executed. Output garbled.
14 }
(gdb)
</code>