обмен между массивами символов - PullRequest
1 голос
/ 07 октября 2011

У меня возникли проблемы с пониманием разницы между выполнением вышеуказанного кода на 8-байтовой (64-битной) платформе и 4-байтовой (32-битной) платформе: его запуск на 4-байтовой платформе не работает - массивы не меняются местами ; на 8 байтах работает, но с предупреждениями.

#include <stdio.h>

void switchNames(char **a, char **b)
{
    char* temp = *a;
    *a = *b;
    *b = temp;
}

int main ()
{
    char labc[10] = "labc";
    char labcpp[10] = "labcpp";
    printf("Before switch: labc = %s, labcpp = %s\n", labc,    labcpp);
    switchNames(&labc, &labcpp);
    printf("After switch: labc = %s, labcpp = %s\n", labc,    labcpp);
    return 0;
}

Ответы [ 2 ]

1 голос
/ 15 октября 2014

Hello. Вы должны выделить 2 новые целевые строки (char *) для этого в куче (используя new) внутри метода, затем выполнить копирование строк, удалить и т. Д. Возможно, имеет смысл использовать обработку исключений в случае, если вы постоянно программируете с помощью const char * в вашем главном (). Оператор Stringizing может быть полезен при работе с кучей ..: -)

// Preprocessor string constants
#define TEXT1 Hello 12345
1 голос
/ 07 октября 2011

Вы читали предупреждения? Они скажут вам причину проблемы. Поведение вашего кода не определено. &labc и &labcpp имеют тип char * const *, (постоянный указатель на указатель на символ), но вы передаете их функции, ожидающей char ** (указатель на указатель на символ). Я удивлен, что это работает при любых обстоятельствах. Этот код должен компилироваться без предупреждений и работать как положено:

char *labc = "labc";
char *labcpp = "labcpp";
char **a = &labc;
char **b = &labcpp;

switchNames(a, b);

Не игнорируйте предупреждения компилятора. И получите копию C: Справочное руководство от Harbison and Steele.

...