Переключить строку c языком - PullRequest
0 голосов
/ 07 февраля 2012

У меня есть эта программа, в которой я хочу понять следующий вывод:

#include <stdio.h> 
void fastSwap (char **i, char **d) 
{ 
  char *t = *d; 
  *d = *i; 
  *i = t; 
} 
int main () 
{ 
 char num1[] = "hellohello"; 
 char num2[] = "classclass"; 
 fastSwap ((char**)&num1,(char**)&num2); 
 printf ("%s\n",num1); 
 printf ("%s\n",num2); 
 return 0; 
} 

Выходные данные изменят только sizeof(void*) символов вместо всего массива.

почему это происходит?

&num1 это char**, не так ли?

Ответы [ 4 ]

5 голосов
/ 07 февраля 2012

& num1 - это символ **, не так ли?

Это char (*)[11].Тот факт, что вы применили char **, перекрыл предупреждения компилятора.

То, что вы делаете, является совершенно неопределенным поведением.Вы не можете сделать num1 точкой где-то еще, потому что она никуда не указывает с самого начала: это массив, а не указатель.

EDIT

Как указывает Пол Р., вотчто, вероятно, происходит.Первые sizeof(char *) символы каждой строки интерпретируются как указатель, а затем они меняются местами.То, что происходит по существу, зависит от размера указателя на вашей реализации.Это довольно интересно, однако я уверен, что оно все еще считается неопределенным.

1 голос
/ 07 февраля 2012

Как указывалось в некоторых других публикациях, num1 и num2 являются массивами, а не указателями на строки. Похоже, что цель состоит в том, чтобы поменять 2 указателя на символы. Так что переписывание чего-то подобного должно работать.

#include <stdio.h> 
void fastSwap (char **i, char **d) 
{ 
  char *t = *d; 
  *d = *i; 
  *i = t; 
} 
int main () 
{ 
 char * num1 = "hellohello"; // Note making a pointer rather than array.
 char * num2 = "classclass"; 
 fastSwap (&num1,&num2); // Shouldn't need the casts.
 printf ("%s\n",num1); 
 printf ("%s\n",num2); 
 return 0; 

}

0 голосов
/ 07 февраля 2012

Если вы напечатаете значения указателя num1 и & num1, вы получите одно и то же значение.Таким образом, вы в основном скопируете первые байты размера (char **), вот и все.

Массив не является указателем.Он может работать одинаково для многих операций, но это не так.Скорее всего, компилятор непосредственно сохраняет положение массива в коде, а не сохраняет указатель на данные в указателе char **.

0 голосов
/ 07 февраля 2012

Вам следует либо поменять значения самих указателей (но они не указатели, а массивы), либо использовать цикл for, чтобы поменять местами каждый символ (или использовать функцию C, например strcpy / strncpy, чтобы выполнить обмен и использовать внешняя переменная выше как временная переменная).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...