Перед началом цикла dp
указывает на начало выделенной памяти.На каждой итерации вы копируете символ, обозначенный src
, в текущую указанную позицию dp
и переходите на одну позицию памяти, указанную dp
.В конце цикла dp
указывает на область памяти сразу после символа p
, которому вы присвоили '\0'
.Когда вы пытаетесь напечатать строку с puts (dp)
, потому что содержимое dp
изменилось и теперь указывает на местоположение справа после последнего скопированного символа , оно начнет печать с этого места.Будет напечатана пустая строка, поскольку самое первое местоположение, на которое указывает dp
, является нулевым символом.
До цикла
+----------+
| src |
+----------+
|
|
V
+-----+-----+-----+-----+-----+-----+-----+---- ----+----+
| h | t | t | p | : | / | / | . . . ? | ? |
+-----+-----+-----+-----+-----+-----+-----+---- ----+----+
+----------+
| dp |
+----------+
|
|
V
+-----+-----+-----+-----+-----+-----+-----+---- ----+----+
| | | | | | | | . . . | |
+-----+-----+-----+-----+-----+-----+-----+---- ----+----+
После цикла (с dp = malloc (10))
+----------+
| src |
+----------+
|
|
V
+-----+-----+-----+-----+-----+-----+-----+---- ----+----+
| h | t | t | p | : | / | / | . . . | ? |
+-----+-----+-----+-----+-----+-----+-----+---- ----+----+
+----------+
| dp |
+----------+
|
|
V
+-----+-----+-----+-----+-----+-----+-----+---- ----+----+
| h | t | t | p | \0 | | | . . . | |
+-----+-----+-----+-----+-----+-----+-----+---- ----+----+
Примечание puts (dp)
начнет печатать печать с места, указанного выше.Это не даст ожидаемый результат.Кроме того, поскольку вы не сохранили исходный адрес dp
, который вы фактически присвоили.Вы не можете восстановить его после цикла.
После цикла (с dp = & схема)
+----------+
| src |
+----------+
|
|
V
+-----+-----+-----+-----+-----+-----+-----+---- ----+----+
| h | t | t | p | : | / | / | . . . | ? |
+-----+-----+-----+-----+-----+-----+-----+---- ----+----+
+----------+
| dp |
+----------+
|
|
V
+-----+-----+-----+-----+-----+-----+-----+---- ----+----+
scheme[ | h | t | t | p | \0 | | | . . . | | ]
+-----+-----+-----+-----+-----+-----+-----+---- ----+----+
puts (scheme) will work because it still refers to the base of the array
puts (dp) will not work because it does not point to the base of the array
and currently points to a location pointing to null character
В вышеупомянутом комментируемом вашем решении работает, потому что вы используете scheme
массив для печати строки.scheme
относится к массиву, который вы хотите напечатать, а scheme
относится к базовому адресу массива, потому что вы не изменили его (и он не может быть изменен).Вот почему он начинается с базы и печатается до '\0'
, назначенного вами после цикла.
Вы можете сделать
int i;
for (i=0; (src[i] != ':') && (src[i] != '\0'); i++)
{
dp[i] = src[i];
}
или выполнить следующие действия
char *dp_bak;
char *dp = malloc(10);
dp_bak = dp; /* Backup the base address */
while (*src != ':')
{
*dp = *src;
src++;
dp++;
}
*dp = '\0';
dp = db_bak; /* Restore the base address */
puts (dp);