Проблема с обменом C char [] - PullRequest
       1

Проблема с обменом C char []

1 голос
/ 23 сентября 2011

У меня есть этот короткий код:

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

Вывод этой короткой программы:

claso
hells

и я просто не понимаю, почему последние буквы каждого символа [] меняются местами. Есть идеи?

Ответы [ 3 ]

5 голосов
/ 23 сентября 2011
fastSwap ((char**)&num1,(char**)&num2);

Это неопределенное поведение.Вы не можете привести указатель на массив char к указателю на указатель на char.Вам нужно:

const char* num1 = "hello";
const char* num2 = "class";
fastSwap (&num1,&num2);

Также вам нужно изменить объявление fastSwap и добавить внутренний аргумент const к аргументам

void fastSwap (const char **i, const char **d)
2 голосов
/ 23 сентября 2011

Я предполагаю, что вы пытаетесь поменять содержимое массивов num1 и num2, просто манипулируя указателями, так что после вызова fastswap содержимое num1 будетбудет "class" и num2 будет "hello".

Если это так, то это не будет работать по ряду причин.Массивы не являются указателями, хотя массив выражений часто преобразуется в типы указателей.Во-вторых, вы не можете изменить значение выражения массива.

Если вы хотите сохранить num1 и num2 в качестве массивов (в отличие от указателей на строковые литералы) и иметь возможность поменять их содержимое, вам нужно кое-что еще в этом духе:*

void fastswap(char *i, char *d)
{
  while (*i && *d)
  {
    char t = *i;
    *d++ = *i;
    *i++ = t;
  }
}

, который будет называться

fastswap(num1, num2);
0 голосов
/ 23 сентября 2011

Вы передаете указатели указателям на символы. Вы, вероятно, просто хотите передать указатели на символы следующим образом:

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

Это меняет первый символ из двух массивов символов.

...