我无法理解在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;
}
答案 0 :(得分:1)
你看过警告了吗?他们会告诉你问题的原因。代码的行为未定义。 &labc
和&labcpp
具有类型char * const *
,(指向char的指针的const指针),但是您将它们传递给期望char **
的函数(指向char的指针)。我很惊讶它在任何情况下都有效。此代码应该在没有警告的情况下编译并按预期工作:
char *labc = "labc";
char *labcpp = "labcpp";
char **a = &labc;
char **b = &labcpp;
switchNames(a, b);
不要忽略编译器警告。并获得Harbison和Steele的 C:A Reference Manual 的副本。
答案 1 :(得分:1)
您好。您应该在方法中为堆上的(使用new)分配2个新目标字符串(char *),然后执行字符串复制,删除等。如果您使用const char *进行编程,则使用异常处理可能有意义在你的主()。在堆上工作时,字符串化运算符可能会有所帮助..: - )
// Preprocessor string constants
#define TEXT1 Hello 12345